加载具有内存效率的大图像

时间:2012-10-25 13:29:25

标签: c# .net image memory

我使用的是.NET4.5,Windows Forms和C#。

我正在使用以下方法将图像加载到按钮上:

theButton.BackgroundImage = Image.FromFile("file.png");

问题是我的按钮是128x128,图像是4000x8000。上面的行占用了大量的内存,因为file.png太大了。

有没有人知道我可以用来减少内存占用的技术?我在考虑这样的功能:

Image.FromFile(file,width,height);

任何指针?感谢。

3 个答案:

答案 0 :(得分:2)

是的,它有效。调整图像大小然后在按钮上显示它非常简单。

但是,我不认为上面的代码会保持图像的宽高比。

使用宽高比调整图像大小非常简单;然后在按钮上显示它。 下面的示例代码可帮助您通过保持纵横比来调整图像大小。 您可以在现有类中定义新类或实现“ResizeImage”方法。无论哪个对你感到舒服。

public class ImageManipulation
{
    public static Bitmap ResizeImage(Bitmap originalBitmap, int newWidth, int maxHeight, bool onlyResizeIfWider)
    {
        if (onlyResizeIfWider)
        {
            if (originalBitmap.Width <= newWidth)
            {
                newWidth = originalBitmap.Width;
            }
        }

        int newHeight = originalBitmap.Height * newWidth / originalBitmap.Width;
        if (newHeight > maxHeight)
        {
            // Resize with height instead
            newWidth = originalBitmap.Width * maxHeight / originalBitmap.Height;
            newHeight = maxHeight;
        }

        var alteredImage = new Bitmap(originalBitmap, new Size(newWidth, newHeight));
        alteredImage.SetResolution(72, 72);
        return alteredImage;
    }
}

用法:

private void DisplayPhoto()
{
    // make sure the file is JPEG or GIF
                System.IO.FileInfo testFile = new System.IO.FileInfo(myFile);

    // Create a new stream to load this photo into
                FileStream myFileStream = new FileStream(myFile, FileMode.Open, FileAccess.Read);

    // Create a buffer to hold the stream of bytes
                photo = new byte[myFileStream.Length];
                // Read the bytes from this stream and put it into the image buffer
                myStream.Read(photo, 0, (int)myFileStream.Length);
                // Close the stream
                myFileStream.Close();

    // Create a new MemoryStream and write all the information from
            // the byte array into the stream
            MemoryStream myStream = new MemoryStream(photo, true);
            myStream.Write(photo, 0, photo.Length);

            // Use the MemoryStream to create the new BitMap object
            Bitmap FinalImage = new Bitmap(myStream);
            upicPhoto.Image = ImageManipulation.ResizeImage(
                                                FinalImage,
                                                upicPhoto.Width,
                                                upicPhoto.Height,
                                                true);


            // Close the stream
            myStream.Close();
}

答案 1 :(得分:0)

我认为你最好的方法就是调整图像大小,调整到128x128。 无论你用它做什么,大的图像总会占用大量的内存。

这也可以让你的图像在那个尺寸上显得很好。

答案 2 :(得分:0)

这是一个非常普遍的问题,AFAIK你很少有可能

  1. 在上传之前压缩图片,在现实世界中这不起作用。
  2. 检查图像的大小和尺寸,在现实世界中,即使是facebook,也不会允许我们上传指定尺寸以上的图像。
  3. 使用缓冲,这是你在.net
  4. 中最干净的方法
  5. 使用一些第三方插件或开发环境,我已在Silverlight中完成了