我需要做的是调整ImageFormat为PNG的Image。
现在我这样做:
public static byte[] ResizeImage(Image image, int width, int height)
{
byte[] result = new byte[65000];
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
using (MemoryStream stream = new MemoryStream())
{
destImage.Save(stream, ImageFormat.Png);
result = stream.ToArray();
return result;
}
}
事情是在“最后阶段”我在字节数组中需要这个图像。这种调整大小的方法不能很好地工作,因为它使这个图像“更重”。
通常我使用此方法将图像转换为PNG:
public byte[] imageToByteArray(Image imageIn) {
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.ToArray();
}
但最终的“重量”(在imageTobyteArray之后)并不能满足我,所以我想调整它以使其“更轻”(Resize方法)。
但是在最后的结果中,我的Resize方法会让它变得更重,有什么想法吗?
@for示例在我截取桌面(1366x768)并使用imageTobyteArray后需要60,000个字节,然后我调整它(例如1200x768)并且在byteArray中需要150,000个字节。调整大小后不应少于6万?如果我的想法错了,请纠正我
答案 0 :(得分:2)
您似乎将图像复杂性与图像大小混淆。
查看原始1366x768图像中的实际像素。请注意图像看起来有多干净?事物的边缘是如何美观和锐利,颜色数量相当低等等?这是因为这些图像(相对)简单。
现在使用您喜欢的任何方法调整图像大小,然后再次查看像素。通过调整大小过程,边缘变得模糊,模糊。颜色计数很好,等等。总之,图像复杂性增加了。
图像中的平滑渐变压缩非常,大量的颜色计数等等。这就是为什么你的较小但很多更复杂的图像压缩PNG的原因很差。如果您想要复杂图像的小文件大小,请使用JPEG并使用压缩工件。