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

C# 从位图转换为JPEG并保留原始位图分辨率,c#,.net,bitmap,jpeg,dpi,C#,.net,Bitmap,Jpeg,Dpi,我正在使用下面的代码将位图转换为jpeg。位图以300 dpi(水平/垂直分辨率)通过,但CreateBitmapSourcefromHBitmap方法始终更改要以96 dpi保存的后续jpeg 有没有办法将震源设置为保留原始300dpi?dpiX和dpiY值为只读 提前谢谢 public static MemoryStream GetJpgMemoryStream(Bitmap bitMap, int jpgQuality) { IntPtr hBitmap = bitMap.GetH

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

有没有办法将震源设置为保留原始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;

    }
}

他们的讨论与你的问题类似。建议不要使用互操作,而是使用
WriteableBitmap
作为JPEG的
BitmapSource

您必须更改用于生成
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);