【问题标题】:Code using large memory to display images?使用大内存显示图像的代码?
【发布时间】:2013-08-21 10:14:02
【问题描述】:

我正在使用 Winforms 和 C# 制作一个简单的图像查看器和编辑器,但我遇到了一个我认为可能存在于这个函数中的问题;

    /// <summary>
    /// Extracts image details from specified image file.
    /// </summary>
    /// <param name="BitmapName">The name of file to process.</param>
    /// <param name="ImageName">The TextBox to recieve image name.</param>
    /// <param name="ImageCreated">The TextBox to recieve image creation date.</param>
    /// <param name="Size">The TextBox to recieve image size.</param>
    /// <param name="Width">The TextBox to recieve image width.</param>
    /// <param name="Height">The TextBox to recieve image height.</param>
    /// <param name="HResolution">The TextBox to recieve image's Horizontal Resolution.</param>
    /// <param name="VResolution">The TextBox to recieve image's Vertical Resolution.</param>
    /// <param name="Type">The TextBox to recieve the type of image.</param>
    /// <param name="Preview">The PictuteBox to display this image as a preview.</param>
    public void GetImageData(string BitmapName, TextBox ImageName, TextBox ImageCreated, TextBox Size, TextBox Width, TextBox Height, TextBox HResolution, TextBox VResolution, TextBox Type, PictureBox Preview)
    {
        try
        {
            FileInfo fileinfo = new FileInfo(BitmapName);
            ImageName.Text = fileinfo.Name;
            ImageCreated.Text = fileinfo.CreationTime.ToString();
            Size.Text = (fileinfo.Length / 1024).ToString() + " Kilobytes";
            Image image = Image.FromFile(BitmapName);
            Bitmap Bit = new Bitmap(image);
            Height.Text = Bit.Height.ToString() + " px";
            Width.Text = Bit.Width.ToString() + " px";
            HResolution.Text = Bit.HorizontalResolution.ToString() + " dpi";
            VResolution.Text = Bit.VerticalResolution.ToString() + " dpi";
            if (fileinfo.Extension == ".bmp" || fileinfo.Extension == ".BMP")
            {
                Type.Text = "Bitmap Image";
            }
            else if (fileinfo.Extension == ".jpeg" || fileinfo.Extension == ".JPEG")
            {
                Type.Text = "Jpeg Image";
            }
            else if (fileinfo.Extension == ".jpg" || fileinfo.Extension == ".JPG")
            {
                Type.Text = "Jpg Image";
            }
            else if (fileinfo.Extension == ".png" || fileinfo.Extension == ".PNG")
            {
                Type.Text = "Png Image";
            }
            else if (fileinfo.Extension == ".gif" || fileinfo.Extension == ".GIF")
            {
                Type.Text = "GIF Image";
            }
            Preview.Image = image;
            Bit.Dispose();
        }
        catch (OutOfMemoryException)
        {
            Preview.Image = Properties.Resources.InvalidImage;
        }
    }

,此函数使用 Bitmap 类提取图像细节,但在查看 20-30 张图像后,它使用了将近 600-700 MB RAM。请告诉我哪里出错了。

【问题讨论】:

    标签: c# winforms image picturebox viewer


    【解决方案1】:

    在更改 Preview.Image 之前,您不处理它,试试这个:

     public void GetImageData(string BitmapName, TextBox ImageName, TextBox ImageCreated, TextBox Size, TextBox Width, TextBox Height, TextBox HResolution, TextBox VResolution, TextBox Type, PictureBox Preview)
        {
          try
          {
            FileInfo fileinfo = new FileInfo(BitmapName);
            ImageName.Text = fileinfo.Name;
            ImageCreated.Text = fileinfo.CreationTime.ToString();
            Size.Text = (fileinfo.Length / 1024).ToString() + " Kilobytes";
            Image image = Image.FromFile(BitmapName);
            using (Bitmap Bit = new Bitmap(image))
            {
              Height.Text = Bit.Height.ToString() + " px";
              Width.Text = Bit.Width.ToString() + " px";
              HResolution.Text = Bit.HorizontalResolution.ToString() + " dpi";
              VResolution.Text = Bit.VerticalResolution.ToString() + " dpi";
              if (fileinfo.Extension == ".bmp" || fileinfo.Extension == ".BMP")
              {
                Type.Text = "Bitmap Image";
              }
              else if (fileinfo.Extension == ".jpeg" || fileinfo.Extension == ".JPEG")
              {
                Type.Text = "Jpeg Image";
              }
              else if (fileinfo.Extension == ".jpg" || fileinfo.Extension == ".JPG")
              {
                Type.Text = "Jpg Image";
              }
              else if (fileinfo.Extension == ".png" || fileinfo.Extension == ".PNG")
              {
                Type.Text = "Png Image";
              }
              else if (fileinfo.Extension == ".gif" || fileinfo.Extension == ".GIF")
              {
                Type.Text = "GIF Image";
              }
              if (Preview.Image != null)
                Preview.Image.Dispose();
              Preview.Image = image;
            }
          }
          catch (OutOfMemoryException)
          {
            Preview.Image = Properties.Resources.InvalidImage;
          }
        }
    

    【讨论】:

    • 这可能是解决方案,但您还想使用内存分析器来真正确定。您正在处理图像,因此您必须注意这些事情。内存分析器非常易于使用,它们向您展示了很大的改进空间。
    【解决方案2】:

    你不处理图像,只使用位图

    bit = new Bitmap(filename);
    

    加载图片广告位图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2011-10-14
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多