我使用的是.NET4.5,Windows Forms和C#。
我正在使用以下方法将图像加载到按钮上:
theButton.BackgroundImage = Image.FromFile("file.png");
问题是我的按钮是128x128,图像是4000x8000。上面的行占用了大量的内存,因为file.png太大了。
有没有人知道我可以用来减少内存占用的技术?我在考虑这样的功能:
Image.FromFile(file,width,height);
任何指针?感谢。
答案 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你很少有可能