1

我想在 WPF 中打开一个 .jpg 文件,将其缩小到 50% 左右,然后将其保存回文件系统。这样做的好/有效的方法是什么?

4

3 回答 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 回答
0

看看对这个问题投票最多的答案。它提供了一个用于处理图像的辅助类。看看ResizeImage功能和SaveJpeg功能。

编辑:

我在这里找到了更多特定于 WPF 的内容。

于 2009-11-20T14:37:05.307 回答