使用.NET,C#调整内存中的jpeg流大小

时间:2014-07-24 14:23:10

标签: c# wpf image

我正在使用WPF,.NET 3.5,C#。我在从数据库加载的内存中有jpeg文件字节数组,我想在内存中调整它的大小。

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

请帮我这样做。

2 个答案:

答案 0 :(得分:0)

快速谷歌搜索产生MSDN article说明如何执行此操作。

一个简单的例子:

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);

注意我的示例使用文件,但这只是用于加载和保存。所有工作都在内存中完成,如果更适合您的工作流程,您可以从内存流中加载和保存。

答案 1 :(得分:0)

您也可以使用此功能:

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;
}

microsoft建议使用此功能,因为图像不是以原始大小保存,而是以 newWidth 的大小保存。如果用户输入巨大的图像,它可以避免内存溢出。