在WPF中缩放.jpg文件

在WPF中缩放.jpg文件,wpf,image,scale,jpeg,image-scaling,Wpf,Image,Scale,Jpeg,Image Scaling,我想在WPF中打开一个.jpg文件,将其缩小到50%左右,然后将其保存回文件系统。做这件事的好/有效方法是什么?看看投票最多的答案。它提供了一个用于操作图像的帮助器类。查看ResizeImage函数和SaveJpeg函数 编辑: 我发现了一些更特定于WPF的内容。如果您想节省内存使用量,应该研究在BitmapImage或JPEG解码器上指定DecodePixelWidth/DecodePixelHeight 可以使用来完成缩放。我在这里使用了两个函数。ResizeImage接受原始图像作为字节数

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

看看投票最多的答案。它提供了一个用于操作图像的帮助器类。查看
ResizeImage
函数和
SaveJpeg
函数

编辑:


我发现了一些更特定于WPF的内容。

如果您想节省内存使用量,应该研究在BitmapImage或JPEG解码器上指定DecodePixelWidth/DecodePixelHeight


可以使用来完成缩放。

我在这里使用了两个函数。ResizeImage接受原始图像作为字节数组和目标大小(以像素为单位)。此函数将大小调整后的图像作为字节数组返回。你可以把它写在文件里

遵循以下步骤

1) 使用BinaryReader以字节数组形式读取图像

2) 通过传递此数组和imag的目标大小来调用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;
}

詹姆斯要求WPF解决方案。另一个问题使用GDI+/WinForms解决方案