在WPF中缩放.jpg文件

时间:2009-11-20 14:34:49

标签: wpf image scale jpeg image-scaling

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

3 个答案:

答案 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)

this question为最受欢迎的答案来看看答案。它提供了一个用于操作图像的辅助类。请查看ResizeImage函数和SaveJpeg函数。

编辑:

我找到了更具体的WPF here