如何在保持高质量的同时在C#中调整图像大小?

我从这里找到了一篇关于图像处理的文章: http : //www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing一切正常。

我希望在调整图像大小时保持高质量。 我想如果我可以增加DPI值,我可以实现这一点。 有谁知道这是否可能? 如果是这样,我怎样才能在C#中实现它?

对于初学者来说,值得指出的是,图像有两大类; 矢量[例如SVG,WMF,Adobe Illustrator和Corel Draw Graphics]和位图(也称为光栅)图像[例如位图,JPEG和PNG图像]。

矢量图像由一系列数学方程和/或计算形成。 另一方面,位图图像由各个点(像素)组成,每个点对应于拍摄图像的对象上的特定特征。

如果您想要调整图像大小,首先要考虑的是它是位图还是矢量图像。 由于矢量图像是从计算中获得的,因此可以完美地调整它们的大小而不会丢失任何细节。 位图图像的情况不同。 由于每个像素都独立于另一个像素,因此当您希望调整其大小时,您只需增加或减少源到目标像素比率。

因此,为了使矢量图像的大小加倍,只需将目标尺寸乘以2,一切都可以正常。 如果应对位图应用相同的效果,实际上是增加每个源像素以覆盖四个像素(两行,两个水平像素)。

当然,通过应用插值和滤波,计算机可以“平滑”目标像素的边缘,使它们看起来彼此融合并给出合理resize的图像的外观,但是此输出与调整矢量大小永远不同图片; 矢量图像完美resize。

您还在问题中提到了DPI 。 DPI基本上是在打印图像时对应于一英寸的像素数,而不是在屏幕上查看时的像素数。 因此,通过增加图像的DPI,您不会增加屏幕上图像的大小。 您只能提高打印质量[不用说取决于打印机的最大分辨率]。

如果您真的希望调整图像大小并且图像是位图,根据经验,不要将尺寸增加到原始图像尺寸的200%以上,否则您将失去质量。

您可以看到此代码的答案 ,以调整位图图像的大小。

要查看示例矢量图像,请转到此链接 。
注意尝试放大和缩小图像以查看其resize。

典型的位图是StackOverflow精灵 。 他们没有保持质量调整。

进一步阅读

  • 矢量图形: http : //en.wikipedia.org/wiki/Vector_image
  • 位图图形: http : //en.wikipedia.org/wiki/Bitmap_image

简单如果原始图像小于重新resize的图像那么几乎没有任何东西可以做。 rest是一个研究问题。

只有它是矢量图形才有可能。 看看SVG。 否则,我认为你可能需要Silverlight或Flex。

你问的是不可能的。 您无法在保持相同质量的同时放大图像。
如果您将图像视为映射的像素数组(字面意思是“位图”),这是有道理的。 使用固定数量的数据保存图像,这是您resize时所需要处理的全部内容。 任何相反的例子(如电视节目,如其中一条评论所建议的)纯粹是虚构的。

您可以做的最好的事情是将您正在使用的Graphics对象的InterpolationMode属性设置为“HighQualityBicubic”,这是GDI +支持的最高质量平滑算法,实际上是市场上的每个主要图形包。 它甚至是Adobe Photoshop提供的最好的。 基本上,插值意味着计算机正在计算您添加的新像素的近似值,以使图像从相邻像素的相对值变大。 这是一种“最好的猜测”方法,但它是我们提出的最佳折衷方案。
至少,得到的图像不会有“锯齿状”或粗糙的像素化线条。

示例代码:

 Graphics g; g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // ... insert the rest of your code here 

除此之外,值得注意的是GDI +(.NET Framework在内部用于图形例程)最适合16的倍数的图像大小。所以如果可能的话,你应该尝试调整已resize的图像的宽度和高度这将保留尽可能多的原始图像质量。

理想的解决方案是切换到可以随意resize的矢量图形。 它们包含用于绘制或“渲染”图像的数学信息,而不是像素信息。 阅读Wikipedia上的更多内容 。

将CompositingQuality,InterpolationMode和SmoothingMode设置为用于重新调整图像大小的Graphics对象。

检查此问题的答案: 高质量图像缩放库

让我们尝试GDI +中的元数据,可能它可以满足您的要求