سؤال

هل هناك أي طريقة لتحويل صورة bmp إلى jpg/png دون فقدان الجودة في C#؟باستخدام فئة الصورة يمكننا تحويل bmp إلى jpg ولكن جودة الصورة الناتجة رديئة للغاية.هل يمكننا الحصول على مستوى جودة جيد مثل الصورة المحولة إلى 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;
    }
}

تعتبر ملحقات Bitmap المقدمة من جيسترو رائعة، لقد استخدمتها.ومع ذلك، أرغب في عرض الإصدار المصحح - يعمل مع فئة الصورة الأصلية وهو أكثر ملاءمة كما أعتقد ويوفر طريقة لتوفير الجودة:

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.InterpolationMode = InterpolationMode.HighQualityBicubic;

و

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

مما يحافظ على الجودة عالية إلى حد ما، ولكن ليس أعلى مستوى ممكن.

أنا أعمل على تطبيق تقرير النفقات، وأنا سعيد حقًا بإعدادات الجودة الافتراضية لـ 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...ربما تحسنت الجودة في إصدارات إطار العمل اللاحقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top