【问题标题】:How to resize png format c#如何调整png格式c#
【发布时间】: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


【解决方案1】:

您似乎将图像复杂性与图像大小混淆了。

查看原始 1366x768 图像中的实际像素。注意图像看起来有多干净?事物的边缘如何漂亮和锐利,颜色数量相当低,等等?那是因为图像(相对)简单。

现在使用您喜欢的任何方法调整该图像的大小并再次查看像素。边缘变得模糊,因调整大小过程而变得模糊。颜色数量增加了,等等。总之,图像复杂度增加了。

图像中的平滑渐变压缩真的很糟糕,大颜色计数等也是如此。这就是为什么您的较小但很多更复杂的图像使用 PNG 压缩效果不佳。如果您想要复杂图像的小文件大小,请使用 JPEG 并遭受压缩伪影。

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多