【发布时间】:2016-03-25 18:26:46
【问题描述】:
我需要做的是调整 ImageFormat 为 PNG 的图像大小。
现在我这样做:
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 方法使它重了两倍,有什么想法吗?
@例如,在我截取我的桌面(1366x768)并使用 imageTobyteArray 后,它需要 60 000 个字节,然后我调整它的大小(例如 1200x768),它在 byteArray 中需要大约 150 000 个字节。调整大小后不应该小于60 000吗?如果我的想法是错误的,请纠正我
【问题讨论】:
-
我认为您在上游可能会遇到错误。我的屏幕 1366 x 768 部分的快照会生成 140k jpg; 132k png 字节数组。在小于 65k 的情况下,这种尺寸的质量不错的图像似乎是不可能的。我手边的一些随机 100x100 头像是 18k!
-
调整大小会插入颜色,这可能会增加图像中的颜色数量,从而降低其可压缩性。如果您可以使用最近邻方法重新采样而不是调整大小,则新图像应该与原始图像一样可压缩。如果您的库提供最近邻插值模式,请尝试。
标签: c# resize compression png bytearray