ImageSharp和System.Drawing的JPEG编码差异

4
我正在将一个.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 vs 470kb),通过使用WinMerge检查结果,我可以看到一些像素是不同的。

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

1个回答

2
我认为在ImageSharp中没有所谓的"System.Drawing" JPG兼容位级模式。
System.Drawing的JPG输出取决于其运行的操作系统,而ImageSharp被设计为与操作系统无关。因此,System.Drawing的输出并不总是与其他System.Drawing实例的输出完全相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接