为什么调整大小会导致图像大小减小

时间:2014-08-15 06:09:59

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

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

例如哪个可能更好解释。我的原始图像为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;
}

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这显然是以不同的图像格式保存(bmp或png vs jpg)或使用不同的JPG压缩强度。

加载图像时应注意图像的格式,并以相同的格式保存。或者在保存jpg时确保使用不同的抗压强度。查看更多here

答案 1 :(得分:0)

您将调整后的图片保存为Jpeg格式。 Jpeg是一种"lossy"格式,这意味着,为了节省空间,保存的图像只是内存中位图的近似值,选择它使它看起来&#34;关闭&#34;原来是人眼。如果您只是使用Image.Save()来保存您的位图,那么&#34;存储质量&#34;根据这篇文章,据信是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;
    }