当前位置: 首页 > 面试题库 >

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

陆弘光
2023-03-14
问题内容

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

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

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

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

我想知道您对此的看法。

谢谢。


问题答案:

处理图像时,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软件以获取最终打印尺寸的提示,该提示将仅使用此信息对图像进行预缩放。与您用来设置打印内容的页面的关系。



 类似资料:
  • 我使用html5画布元素在浏览器中调整图像大小。原来质量很低。我发现:当缩放 时禁用插值,但这无助于提高质量。 下面是我的css和js代码,以及用Photoshop缩放和在画布API中缩放的图像。 当在浏览器中缩放图像时,我必须做什么来获得最佳质量? JS: 使用Photoshop调整图像大小: 在画布上调整了图像大小: 下面是我使用2步缩小尺寸的结果: 下面是我使用三步缩小尺寸的结果: 下面是如

  • 我正在使用画布来修改我的图像。但是,我有一个问题。如果我使用options.inSamplesize=4;图像变得太小,质量下降。但是,如果我不给,它会从内存溢出并给出一个错误。 //位图缩放位图=位图。创建位图(原始1、0、0、宽度、高度、矩阵、真); 这是我当前的错误日志。 11-09 03:21:56.849 12345-12345/com.example.chkee.appfrontE/A

  • 问题内容: 我刚开始学习Go,并通读现有代码以学习“其他人的做法”。在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的地方。 在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(或存在)最佳实践是什么?我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtu

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 使用Enterprise Architect(Version9.2),我创建了一些类和序列UML图。现在我需要那些图表在一个Word文档中。 我的第一种方法是用Windows7剪辑工具将它们剪掉,然后粘贴到文档中。但就印刷而言,质量太差了。 第二种方法是按照Enterprise Architect中提供的“将它们保存为图像”。但有了这个,质量就更差了。 第三种方法是将它们导出到pdf文件中。有了这

  • 本文向大家介绍裁剪画布/导出具有一定宽度和高度的HTML5画布,包括了裁剪画布/导出具有一定宽度和高度的HTML5画布的使用技巧和注意事项,需要的朋友参考一下 为此,创建一个临时画布以在当前画布上进行绘制。之后,在临时画布上使用toDataUrl()方法-