我正在读取一个 .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 版本的输出相同?