我从这里找到了一篇关于图像处理的文章:http ://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing一切正常。
我想在调整图像大小时保持高质量。我想如果我可以增加 DPI 值,我可以做到这一点。有谁知道这是否可能?如果是这样,我如何在 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,一切都会好起来的。如果您应该在位图上应用相同的效果,您实际上是在增加每个源像素以覆盖四个像素(两行两个水平像素)。
当然,通过应用插值和滤波,计算机可以“平滑”出目标像素的边缘,使它们看起来相互融合并给出合理调整大小的图像的外观,但这种输出与调整矢量大小不同图片; 矢量图像完美调整大小。
您还在问题中提到了DPI。DPI 本质上是在打印图像时对应于一英寸的像素数,而不是在屏幕上查看时的像素数。因此,通过增加图像的 DPI,您不会增加屏幕上图像的大小。您只会提高打印质量[不用说取决于打印机的最大分辨率]。
如果您真的想调整图像的大小并且图像是位图,根据经验,不要将大小增加到原始图像大小的 200% 以上,否则您将失去质量。
您可以查看此答案以获取调整位图图像大小的代码。
要查看示例矢量图像,请访问此链接。
注意尝试放大和缩小图像以查看其调整大小的程度。
一个典型的位图是StackOverflow 精灵。他们不保持他们的质量调整大小。
延伸阅读
简单地说,如果原始图像比调整大小的图像小,那么您几乎无能为力。休息是一个研究问题。
只有当它是矢量图形时才有可能。查看 SVG。否则,我认为您可能需要 Silverlight 或 Flex 来完成该部分。
你要问的根本不可能。您无法在保持相同质量的同时放大图像。
如果您将图像视为像素的映射数组(字面意思是“位图”),这是有道理的。图像与固定数量的数据一起保存,当您调整它的大小时,这就是您所要做的一切。任何相反的例子(如其中一条评论所建议的电视节目)纯属虚构。
您可以做的最好的事情是将用于调整大小的对象的InterpolationMode
属性Graphics
设置为“HighQualityBicubic”,这是 GDI+ 支持的最高质量平滑算法,实际上市场上每个主要图形包都支持。它甚至是 Adobe Photoshop 所能提供的最好的。本质上,插值意味着计算机正在计算您要添加的新像素的近似值,以使图像相对于相邻像素的相对值更大。这是一种“最佳猜测”方法,但它是我们迄今为止提出的最佳折衷方案。
至少,生成的图像不会有“锯齿”或粗糙的像素化线条。
示例代码:
Graphics g;
g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// ... insert the rest of your code here
除此之外,值得注意的是 GDI+(.NET Framework 在内部用于图形例程)最适合 16 的倍数的图像大小。因此,如果可能的话,您应该尝试调整调整大小的图像的宽度和高度16 的倍数。这将尽可能多地保留原始图像质量。
理想的解决方案是切换到可以随意调整大小的矢量图形。它们包含用于绘制或“渲染”图像的数学信息,而不是像素信息。阅读更多关于维基百科。
让我们试试 GDI+ 中的元数据,也许它可以满足您的要求