导出具有高质量图像的画布的最佳做法是啥?

Posted

技术标签:

【中文标题】导出具有高质量图像的画布的最佳做法是啥?【英文标题】:What is the best practice to export canvas with high quality images?导出具有高质量图像的画布的最佳做法是什么? 【发布时间】:2013-06-06 05:03:03 【问题描述】:

我需要你的帮助。 我解释了我的情况:我正在使用 fabric.js 库在我的应用程序中放置形状、文本等。 我的画布尺寸为 1000x1000 像素(约 26.45x26.45 厘米)。 我有一个图片上传脚本,仅用于上传高质量的图片,比如 300 dpi。

基本上我做的是以下几点: - 绘制画布(上传图片、放置文字等); - 调整画布的大小乘以比例因子,以便最终能够获得 300dpi 的图像; - 以 PNG 格式保存画布; - 使用 php/ajax 和 Imagick,将画布设置为 300 dpi 质量,保存为 jpg 格式。

问题是:当我保存画布时,上传图像的质量会下降,因为我将画布的大小调整为 72 dpi(在我保存为 PNG 的那一刻)。

我认为一个可能的解决方案是:上传图片时,将位置保存在数组中,x和y位置和大小到整个过程结束,将图片替换为JPG。如果这是最好的方法,是否可以使用 Imagick 库或 PHP 来实现?

我想知道您对此的看法。

谢谢。

【问题讨论】:

【参考方案1】:

在处理图像时,DPI 根本不重要。图像以像素为单位,因此这是您需要调整的。您可以放心地忽略 DPI,因为它在这种情况下没有意义。

缩放在这里对您没有帮助 - 请记住,您使用的是像素设备,而不是矢量,因此画布需要已经具有您想要用于打印等的尺寸,否则您会因插值而降低质量缩放时。

方法如下:

您需要根据最终阶段所需的尺寸预先计算画布尺寸(以像素为单位)。

假设您要以 300DPI 输出打印 15 x 10 厘米(或大约 6 x 4 英寸)的图像。然后计算像素:

Width : 10 cm * 300 / 2.54 = 1181 pixels
Height: 15 cm * 300 / 2.54 = 1772 pixels

对于英寸只需乘以 DPI(4 英寸!= 10 厘米,因此结果略有不同,为简单起见选择数字):

Width : 4 in * 300 = 1200 pixels
Height: 6 in * 300 = 1800 pixels

对于 26.45 cm @ 300 DPI 的图像,画布需要:

26.45 cm * 300 DPI / 2.54 inches = 3124 pixels.

要在屏幕上较小的区域显示该画布,您可以使用 CSS 来显示元素,例如 -

<canvas   style="width:600px;height:600px;"></canvas>

您现在可以在画布的实际像素位置绘制,它会在屏幕上按比例缩小显示(但保留画布本身的所有信息)。如果您使用鼠标坐标,您只需按比例缩放鼠标位置(画布位置 = 鼠标坐标 * 3124px / 600px)。

对于缩放等,它变得有点复杂,但原则仍然存在:图像的最终尺寸必须是最终结果的尺寸。

关于 DPI:如果此图像是 72 DPI 或 300 DPI,则像素数将完全相同。已经提到的原因是图像以像素为单位。

当涉及到像素设备(位图、显示器、相机等)时,DPI 是一个任意值,仅用于 DTP 软件以获取最终打印尺寸的提示,该信息仅用于预缩放与您用来设置打印的页面相关的图像。

【讨论】:

这里有另一种方法***.com/questions/28778396/… @K3N:我听从了你的建议,但我遇到了一个问题,正在放置的文本非常小。请看小提琴jsfiddle.net/Q3TMA/1042 @Abhinav 字体大小必须在绘制前提前放大。您可以为此使用 scale() 或直接尝试使用字体高度。由于字体的制作方式,后者并不总是线性的,但你应该能够接近。 但是大小控件仍然显得很小,图像可以做什么? @Abhinav 我建议您将其作为一个新问题打开。我在这里的回答只涉及基本原则。

以上是关于导出具有高质量图像的画布的最佳做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为 Nextjs 的图像提供源的最佳方式是啥?

绘制到 html 画布中的 png 图像质量较差

如何在不损失图像质量的情况下调整图像大小以适合小型 HTML5 画布? [复制]

在较小的屏幕尺寸上,在 HTML 画布上呈现的图像质量很差

iText:降低图像质量(用于减小生成的 PDF 大小)

画布 todataURL 图像 Png 质量不起作用