簡體   English   中英

Cmp中的Bmp到jpg / png

[英]Bmp to jpg/png in C#

有沒有辦法將bmp圖像轉換為jpg / png而不會失去C#的質量? 使用Image類我們可以將bmp轉換為jpg,但輸出圖像的質量非常差。 我們可以使用最高質量的photoshop獲得與轉換為jpg的圖像一樣好的質量水平嗎?

var qualityEncoder = Encoder.Quality;
var quality = (long)<desired quality>;
var ratio = new EncoderParameter(qualityEncoder, quality );
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">;
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG
public static class BitmapExtensions
{
    public static void SaveJPG100(this Bitmap bmp, string filename)
    {            
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static void SaveJPG100(this Bitmap bmp, Stream stream)
    {
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }

        return null;
    }
}

由jestro提供的BitmapExtensions很棒,我用它們。 但是想要顯示更正的版本 - 適用於Image父類,這比我想象的更方便,並提供了一種提供質量的方法:

public static class ImageExtensions
{
    public static void SaveJpeg(this Image img, string filePath, long quality)
    {
        var encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
        img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static void SaveJpeg(this Image img, Stream stream, long quality)
    {
        var encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
        img.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        return codecs.Single(codec => codec.FormatID == format.Guid);
    }
}

從根本上說,你將無法保持相同的質量,因為即使有最高質量設置,jpg(據我所知)總是有損。

如果位精確質量非常重要,請考慮使用png,它有一些無損模式。

只是想說JPEG本質上是一種有損格式。 因此,即使在最高設置下你也會有一些信息丟失,但它在很大程度上取決於圖像。但是png是無損的。

我正在開發一個費用報告應用程序,從Bitmap對象保存時,我對JPG(和PNG)的默認質量設置非常滿意。

https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx

Bitmap finalBitmap = ....; //from disk or whatever
finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg);
finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png);

我在使用.NET 4.6 ......也許后續框架版本的質量有所提高。

你可以試試:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

這確實保持了相當高的質量,但不是最高的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM