【问题标题】:Why resizing causes image size to decrease为什么调整大小会导致图像大小减小
【发布时间】:2014-10-08 22:14:00
【问题描述】:

我继承了一个代码来调整图像的宽度和高度。 我还观察到的是,即使图像高度和宽度增加,它也会减小文件大小。 这是保存图像的调整大小代码和调用函数代码

例如,这可能会更好地解释。我有 709*653 像素的原始图像和 670 kb 的文件大小

调整大小后,它是预期的 1000*921,但它的大小是 176 kb

         Image  orgImage = Image.FromFile(originalimagepath);            
        //resizes image using below function
        transformedImage = ImageUtils.resizeImage(orgImage, Settings.MaxLargeImage);
        memstrImage = new MemoryStream();

        //saves image to memorystream which is in turn saved in destination as resized image.  
        transformedImage.Save(memstrImage,ImageFormat.Jpeg);

public static Image resizeImage(Image imgToResize, int resizeType)
{
    //resizetype is maximum resize width I want image to take.
    int height = imgToResize.Height;
    int width = imgToResize.Width;
    float ratio = 0;

    Size size = new Size();

    if (height >= width)
    {
        ratio = ((float)resizeType / (float)height);
    }
    else
    {
        ratio = ((float)resizeType / (float)width);
    }

    size.Height = Convert.ToInt32((float)ratio * (float)imgToResize.Height);
    size.Width = Convert.ToInt32((float)ratio * (float)imgToResize.Width);

    int sourceWidth = imgToResize.Width;
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)size.Width / (float)sourceWidth);
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;

    int destHeight = Convert.ToInt32(sourceHeight * nPercent);
    int destWidth = Convert.ToInt32(sourceWidth * nPercent);

    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((Image)b);
    g.CompositingQuality = CompositingQuality.HighQuality;            
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    g.SmoothingMode = SmoothingMode.HighQuality;

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();

    return (Image)b;
}

我假设,并且可以看到纵横比没有受到影响,但是是否建议保持原样,或者当图像高度和宽度增加时,理想情况下文件大小应该增加是否合乎逻辑

对于这个问题,我想在高度和宽度增加时增加文件大小,但欢迎提出最佳实践建议。

有什么建议吗?

【问题讨论】:

  • 你如何测量以前和新的文件大小?
  • 您确定正确处理位图吗?可能是图像文件尚未最终确定
  • @Euphoric 下载两者。
  • @Sayse 你能解释更多吗?你发现代码有什么问题吗?
  • 您使用的是什么图像格式?如果您使用的是“jpg”,则每次保存时都会重新压缩。这会导致尺寸(好)和质量(坏)的减少。如果只使用Image.Save(),默认质量相信为75(source)

标签: c# asp.net image-processing image-resizing


【解决方案1】:

您正在将调整大小的图像保存为Jpeg 格式。 Jpeg 是"lossy" 格式,这意味着,为了节省空间,保存的图像只是内存中位图的近似值,选择它以使其在人眼看来“接近”原始图像。如果你只是使用Image.Save()来保存你的位图,那么“存储质量”被认为是75,根据这篇文章:What quality level does Image.Save() use for jpeg files?。 (无论如何,Jpeg 格式的Image.Save() 的质量没有记录。)

因此,如果您调整位图的大小并将其保存为 Jpeg,则生成的文件可能会比原始文件小,或者由于压缩而更大,与尺寸变化无关。 (尽管 尺寸变化最终会主导任何压缩问题,因为位图的原始尺寸会随着像素尺寸的缩放而二次增加。)

如果您想在保存 JPG 时尝试质量设置如何影响文件大小,可以使用以下方法:

    public static void SaveJpegWithSpecifiedQuality(this Image image, string filename, int quality)
    {
        // http://msdn.microsoft.com/en-us/library/ms533844%28v=vs.85%29.aspx
        // A quality level of 0 corresponds to the greatest compression, and a quality level of 100 corresponds to the least compression.
        if (quality < 0 || quality > 100)
        {
            throw new ArgumentOutOfRangeException("quality");
        }

        System.Drawing.Imaging.Encoder qualityEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters encoderParams = new EncoderParameters(1);
        EncoderParameter encoderParam = new EncoderParameter(qualityEncoder, (long)quality);
        encoderParams.Param[0] = encoderParam;

        image.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParams);
    }

    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }

【讨论】:

  • 我试过了,我的文件大小从 670 kb 变成了 70 kb!
  • @Mandar Jogalekar - 好吧,您应该尝试从 100(最好)到 10(糟糕)的一系列质量,以了解每个质量级别的视觉外观下降的严重程度。跨度>
【解决方案2】:

这显然是保存为不同于原始图像格式(bmp 或 png 与 jpg)或对 JPG 使用不同压缩强度的情况。

您应该在加载图像时记下图像的格式并将其以相同格式保存。或者确保在保存 jpg 时使用不同的压缩强度。查看更多here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 2010-12-28
    • 2020-01-27
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2020-06-14
    相关资源
    最近更新 更多