使用C#缩小Jpeg图像

时间:2015-06-02 12:49:54

标签: c# image

我试图将jpeg图像从3028x4051缩小到854x1171。这导致图像接近1M像素并保持纵横比。原始图片为here。然而,图像缩小非常差。下面是图像的一部分。顶部是在MS绘制中缩小的图像,底部在C#中以编程方式缩小。我已经包含了用于缩减和保存的代码。有谁知道会发生什么?

enter image description here

using (IRandomAccessStream sourceStream = await sourceFile.OpenAsync(FileAccessMode.Read))
{
    BitmapDecoder myDecoder = await GetDecoder(sourceStream);
    BitmapTransform myTransform = new BitmapTransform() { ScaledHeight = h, ScaledWidth = w };
    await myDecoder.GetPixelDataAsync(
            BitmapPixelFormat.Rgba8,
            BitmapAlphaMode.Premultiplied,
            myTransform,
            ExifOrientationMode.IgnoreExifOrientation,
            ColorManagementMode.DoNotColorManage);
    BitmapEncoder myEncoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, destinationStream);
            myEncoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Premultiplied, w, h, 96, 96, pixelData.DetachPixelData());
    await myEncoder.FlushAsync();
}

1 个答案:

答案 0 :(得分:2)

在创建BitmapTransform的新实例的地方,您可以指定插值模式。线性是默认模式,因此要获得更好的结果,您需要尝试使用Cubic或Fant。

using (IRandomAccessStream sourceStream = await sourceFile.OpenAsync(FileAccessMode.Read))
{
    BitmapDecoder myDecoder = await GetDecoder(sourceStream);
    BitmapTransform myTransform = new BitmapTransform() { ScaledHeight = h, ScaledWidth = w, InterpolationMode = BitmapInterpolationMode.Fant };
    await myDecoder.GetPixelDataAsync(
            BitmapPixelFormat.Rgba8,
            BitmapAlphaMode.Premultiplied,
            myTransform,
            ExifOrientationMode.IgnoreExifOrientation,
            ColorManagementMode.DoNotColorManage);
    BitmapEncoder myEncoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, destinationStream);
            myEncoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Premultiplied, w, h, 96, 96, pixelData.DetachPixelData());
    await myEncoder.FlushAsync();
}