ImageSharp 和 System.Drawing Jpeg 编码差异

问题描述 投票:0回答:0

我正在读取一个 .png 文件作为字节数组,并尝试使用 System.Drawing(Microsoft.NETCore.App 6.0.8)和 SixLabors ImageSharp(3.0.1)将图像编码为 jpeg .

我需要以下方法来输出相同的文件内容,以便它们可以互换使用:

internal static void SaveBytesToJpg_ImageSharp(byte[] imageBytes, string fileName)
{
    using (MemoryStream ms = new MemoryStream(imageBytes))
    {
        using (var image = SixLabors.ImageSharp.Image.Load<Rgba32>(ms))
        {

            JpegEncoder jp = new JpegEncoder()
            {
                Quality = 100,
                ColorType = JpegEncodingColor.YCbCrRatio420 
            };
            
            image.SaveAsJpeg(fileName, jp);
        }
    }
}

internal static void SaveBytesToJpg_SystemDrawing(byte[] imageBytes, string fileName)
{
    using (MemoryStream ms = new MemoryStream(imageBytes))
    {
        using (var image = System.Drawing.Image.FromStream(ms))
        {
            EncoderParameters myEncoderParameters = new EncoderParameters(1);
            ImageCodecInfo ici = null;

            // Use codec for better quality.
            myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);

            // color space seems to be  YCbCr 4:2:0

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.MimeType == "image/jpeg")
                    ici = codec;
            }
            try
            {
                image.Save(fileName, ici, myEncoderParameters);
            }
            finally
            {
                for (int i = 0; i < myEncoderParameters.Param.Length; i++)
                {
                    myEncoderParameters.Param[i].Dispose();
                }

                myEncoderParameters.Dispose();
            }
        }
    }
}

通过运行这个简单的测试,我使用这两种不同的方法保存相同的图像:

var imgAsByteArray = File.ReadAllBytes("path.png");

SaveBytesToJpg_ImageSharp(imgAsByteArray, "path1.jpg");
SaveBytesToJpg_SystemDrawing(imgAsByteArray, "path2.jpg");

我得到两个文件的大小略有不同(430kb 对 470kb),并且通过使用 WinMerge 检查结果,我可以看到一些像素不同。

我应该为编码器设置什么设置以确保 System.Drawing 版本和 ImageSharp 版本的输出相同?

c# .net jpeg system.drawing imagesharp
© www.soinside.com 2019 - 2024. All rights reserved.