我想在 WPF 中打开一个 .jpg 文件,将其缩小到 50% 左右,然后将其保存回文件系统。这样做的好/有效的方法是什么?
问问题
2121 次
3 回答
1
如果您想节省内存使用量,您应该考虑在 BitmapImage 或 JpegDecoder 上指定 DecodePixelWidth/DecodePixelHeight。
可以使用TransformedBitmap来完成缩放。
于 2009-11-20T14:39:36.170 回答
1
我在这里使用了 2 个函数。ResizeImage 接受原始图像作为字节数组和以像素为单位的目标大小。此函数将调整大小的图像返回为字节数组。您可以将其写入文件。
跟着这些步骤
1) 使用 BinaryReader 将图像读取为字节数组
2) 通过传递此数组和 imag 的目标大小来调用 ResizeImage 函数。
3) 将返回值存储在 Byte 数组中
4) 使用 BinaryWriter 将其写入文件
byte[] ResizeImage(byte[] imageFile, int targetSize)
{
System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile));
System.Drawing.Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (System.Drawing.Bitmap newImage = new System.Drawing.Bitmap(oldImage, (int)newSize.Width, (int)newSize.Height))
{
using (System.Drawing.Graphics canvas = System.Drawing.Graphics.FromImage(newImage))
{
canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
canvas.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
System.Drawing.Size CalculateDimensions(System.Drawing.Size oldSize, int targetSize)
{
System.Drawing.Size newSize = new System.Drawing.Size();
if (oldSize.Height > oldSize.Width)
{
newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
newSize.Height = targetSize;
}
else
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
}
return newSize;
}
于 2009-11-21T15:15:33.920 回答