用.net、c#在内存中调整jpeg流的大小

本文关键字:jpeg 调整 net 内存 | 更新日期: 2023-09-27 18:14:41

我正在使用WPF, . net 3.5, c#。我有一个jpeg文件字节数组在内存中从数据库加载,我想把它的大小调整到更小的内存大小。

  • 输入是内存中的jpeg文件字节数组。
  • 在内存中输出jpeg文件字节数组,显示调整大小的jpeg图像。
  • 调整大小(和重新编码)应该在内存上完成,而不是使用FILE。
  • 可以通过双行操作来调整大小。

用.net、c#在内存中调整jpeg流的大小

在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的大小保存。它可以避免你的内存溢出,如果用户输入巨大的图像。