一尘不染

导出具有高质量图像的画布的最佳实践是什么?

php

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

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

问题是:保存画布时,上载图像的质量会下降,因为我将画布的大小调整为72 dpi(目前保存为PNG)。

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

我想知道您对此的看法。

谢谢。


阅读 339

收藏
2020-05-29

共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 in!= 10 cm,所以结果略有不同,为简单起见选择了数字 ):

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

对于26.45厘米@ 300 DPI的图像,画布必须为:

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

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

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

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

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

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

对于像素设备(位图,监视器,照相机等),DPI是一个任意值,并且仅用于DTP软件以获取最终打印尺寸的提示,该提示将仅使用此信息对图像进行预缩放。与您用来设置打印内容的页面的关系。

2020-05-29