用.net、c#在内存中调整jpeg流的大小
本文关键字:jpeg 调整 net 内存 | 更新日期: 2023-09-27 18:14:41
我正在使用WPF, . net 3.5, c#。我有一个jpeg文件字节数组在内存中从数据库加载,我想把它的大小调整到更小的内存大小。
- 输入是内存中的jpeg文件字节数组。
- 在内存中输出jpeg文件字节数组,显示调整大小的jpeg图像。
- 调整大小(和重新编码)应该在内存上完成,而不是使用FILE。
- 可以通过双行操作来调整大小。
在google上快速搜索一下,就会得到一篇MSDN文章,说明如何做到这一点。
一个简单的例子:
System.Drawing.Image source = System.Drawing.Image.FromFile(@"Z:'Temp'temp.bmp");
System.Drawing.Image destination = new System.Drawing.Bitmap(128, 128);
using (var g = Graphics.FromImage(destination))
{
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.DrawImage(source, new System.Drawing.Rectangle(0,0,128,128), new System.Drawing.Rectangle(0, 0,source.Width, source.Height), GraphicsUnit.Pixel);
}
destination.Save(@"Z:'Temp'outpt.png", ImageFormat.Png);
注意,我的示例使用文件,但这只是为了加载和保存。所有的工作都是在内存中完成的,如果更适合你的工作流程,你可以从内存流中加载和保存。
你也可以使用这个函数:
public static BitmapImage BitmapImageFromBitmapSourceResized(BitmapSource bitmapSource, int newWidth)
{
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(memoryStream);
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
bImg.DecodePixelWidth = newWidth;
bImg.EndInit();
memoryStream.Close();
return bImg;
}
使用这个函数是微软推荐的,因为图像不会保存为原来的大小,而是以newWidth的大小保存。它可以避免你的内存溢出,如果用户输入巨大的图像。