从位图转换为 JPEG 并保留原始位图分辨率



我正在使用以下代码将位图转换为jpeg。位图以 300 dpi(水平/垂直分辨率)传递,但 CreateBitmapSourcefromHBitmap 方法始终更改后续的 jpeg 以 96dpi 保存。

有没有办法设置源以保留原始的 300dpi?dpiX 和 dpiY 值是只读的。

提前谢谢。

public static MemoryStream GetJpgMemoryStream(Bitmap bitMap, int jpgQuality)
{
    IntPtr hBitmap = bitMap.GetHbitmap();
    try
    {      
        BitmapSource source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        var jpegBitmapEncoder = new JpegBitmapEncoder();
        jpegBitmapEncoder.QualityLevel = jpgQuality;
        jpegBitmapEncoder.Frames.Add(BitmapFrame.Create(source));
        var jpegStream = new MemoryStream();
        jpegBitmapEncoder.Save(jpegStream);
        jpegStream.Flush();

        return jpegStream;
    }
}

MSDN 论坛有一个与您的问题类似的讨论。建议的答案是不使用互操作,而是使用WriteableBitmap作为 JPEG 的BitmapSource

您必须更改用于生成BitmapSource的方法。您可以使用快速将位图转换为位图源 wpf 中所述的方法生成BitmapSource。这是更新的代码。

    BitmapData data = bitMap.LockBits( 
                         new System.Drawing.Rectangle(0,0,bitMap.Width,bitMap.Height), 
                         System.Drawing.Imaging.ImageLockMode.ReadOnly, 
                         bitMap.PixelFormat);
    BitmapSource source = BitmapSource.Create(bitMap.Width, bitMap.Height, 
                                 bitMap.HorizontalResolution, bitMap.VerticalResolution, 
                                 System.Windows.Media.PixelFormats.Bgr24, null,
                                 data.Scan0, data.Stride*bitMap.Height, data.Stride);
    bitMap.UnlockBits(data);
    var jpegBitmapEncoder = new JpegBitmapEncoder();
    jpegBitmapEncoder.QualityLevel = jpgQuality;
    jpegBitmapEncoder.Frames.Add(BitmapFrame.Create(source));
    var jpegStream = new MemoryStream();
    jpegBitmapEncoder.Save(jpegStream);

最新更新