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

时间:2011-02-09 06:07:01

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

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

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

6 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

您可以看到this answer代码来调整位图图像的大小。

要查看示例矢量图像,请转到this link 注意尝试放大和缩小图片以查看其调整大小。

典型的位图是StackOverflow sprites。他们没有保持他们的质量调整大小。


进一步阅读

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

示例代码:

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

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

理想的解决方案是切换到可以随意调整大小的矢量图形。它们包含用于绘制或“渲染”图像的数学信息,而不是像素信息。详细了解Wikipedia

答案 4 :(得分:0)

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

检查此问题的答案:High Quality Image Scaling Library

答案 5 :(得分:0)

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