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