我想在WPF中打开一个.jpg文件,将其缩小到50%左右,然后将其保存回文件系统。这样做的好/有效方法是什么?
答案 0 :(得分:1)
如果你想节省内存使用量,你应该考虑在BitmapImage或JpegDecoder上指定DecodePixelWidth / DecodePixelHeight。
可以使用TransformedBitmap完成缩放。
答案 1 :(得分:1)
我在这里使用了2个功能。 ResizeImage接受原始图像作为字节数组和目标大小(以像素为单位)。此函数将调整大小的图像作为字节数组返回。你可以把它写在文件中。
请按照以下步骤操作
1)使用BinaryReader
将图像读取为字节数组2)通过传递此数组和目标大小来调用ResizeImage函数。
3)以字节数组存储返回值
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;
}
答案 2 :(得分:0)