2009-02-06 100 views
1

我通过使用Graphics.DrawImage方法调整jpegs大小(请参阅下面的代码片段)。任何人都可以确认这不会影响新图像的压缩吗? 我看过this thread,但我正在专门讨论jpeg的压缩。调整jpeg图像大小是否会影响其压缩?

private byte[] getResizedImage(String url, int newWidth) 
    { 
     Bitmap bmpOut = null; 
     System.IO.MemoryStream outStream = new System.IO.MemoryStream(); 

     //input image is disposable 
     using (Bitmap inputImage = LoadImageFromURL(url)) 
     { 
      ImageFormat format = inputImage.RawFormat; 
      decimal ratio; //ratio old width:new width 
      int newHeight = 0; 

      //*** If the image is smaller than a thumbnail just return it 
      if (inputImage.Width < newWidth) 
       return null; 

      ratio = (decimal)newWidth/inputImage.Width; 
      decimal h = inputImage.Height * ratio; 
      newHeight = (int)h; 

      bmpOut = new Bitmap(newWidth, newHeight); 
      Graphics g = Graphics.FromImage(bmpOut); 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      // try testing with following options: 
      //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
      //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
      //g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
      //g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 

      g.FillRectangle(Brushes.White, 0, 0, newWidth, newHeight); 
      g.DrawImage(inputImage, 0, 0, newWidth, newHeight); 
      bmpOut.Save(outStream, getImageFormat(url)); 
     } 

     return outStream.ToArray(); 

    } 

回答

5

JPEG在其中没有保存“压缩”值。当你调整大小并保存它们时,它们会被压缩,并告诉你要使用的保存功能。因为你没有传递一个值,它只会使用图书馆的默认值。

+0

当然 - 我被图形对象蒙上了一层阴影,并设法忽略了比较残酷的Bitmap.Save!谢谢。 – darasd 2009-02-06 15:42:35

0

在您的代码“HighQualityBicubic”是您正在使用的压缩。将尺寸调整为较小尺寸确实可以消除细节,但与压缩无关,只需要较少的像素。

0

JPEG压缩lossy - 不是所有的原始数据的实际存储完全相同。如果您将图像压缩为JPEG格式并对其进行解压缩,则无法获取确切的原始图像。每次压缩和解压时,都会失去一点品质。

对于一些简单的转换(例如旋转JPEG),您可以使用jpegtran等程序进行无损地转换。

但是,对于调整图像大小,你不能无损地做到这一点。当你这样做时,你肯定会降低质量,虽然可能不会太高。如果可能,请尝试使用原始无损图像作为调整大小操作的来源以获得最高质量,如果连接了多个大小调整操作,则只需从原始大小调整一个大小。

0

请勿将存储格式(JPEG)与使用Graphics对象进行操作的格式相混淆。存储格式是压缩的,Graphics对象使用解压缩的数据。

LoadImageFromURL方法将存储在JPEG中的信息解压缩,对解压缩的数据执行调整大小操作,并将其保存为JPEG文件时,再次进行压缩。

由于JPEG压缩不是无损的,所以每次执行此过程时图像质量都会降低:解压缩,变异,重新压缩

如果我误解了你的问题:你用于保存图像的压缩因子inot在你的代码中设置,所以它会在一些默认值。如果您想通过以较小的压缩系数进行保存来减少质量损失,则需要明确设置它。

0

感谢MrZebra给我一个正确的方向。 This article很好地展示了该怎么做。

4

调整图像的大小会影响压缩效果,如果通过“压缩”您指的是多少细节可以适用于多少像素。

JPEG压缩算法倾向于使用梯度和平坦色块的模糊或同质图像。因此,图像尺寸与所得文件大小之间不存在直接相关性。最重要的是细节的图像中的金额(所有图像保存为JPEG有80%的损失系数):

  1. 原来如此标志:

    Original http://magnetiq.com/exports/sologo/original.jpg

    File size: 4,483 bytes

  2. 保留尺寸并应用沉重的高斯模糊:

    Blurred http://magnetiq.com/exports/sologo/blurred.jpg

    File size: 1,578 bytes

  3. 调整原来的1/4:

    Shrunk http://magnetiq.com/exports/sologo/shrunk.jpg

    File size: 2,063 bytes

注意,模糊图像(2),即使它的4倍。 (3)比(1)和(2)的文件大小更小。模糊增加了良好的渐变,使JPEG压缩感到高兴。

小图像(3)虽然只有原始像素的1/4(1),但不是文件大小的1/4。这是因为缩小图像会产生更精细的细节,并且JPEG压缩不会那样。

相关问题