- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
根据docs :
The HTMLCanvasElement.toDataURL() method returns a data URI containing a representation of the image in the format specified by the type parameter (defaults to PNG). The returned image is in a resolution of 96 dpi.
当不涉及打印时,如何引用打印分辨率?
我写了a jsfiddle在 Canvas 上绘制图像,然后调用 toDataURL()。毕竟,结果图像的质量似乎没有受到影响。
我不明白文档中的 96 dpi 是什么意思。有什么想法吗?
var image = new Image();
image.crossOrigin = "Anonymous";
image.src = "...";
// ...
var dataURL = canvas.toDataURL('image/jpeg', 1.0);
window.open(dataURL);
最佳答案
How is it possible to refer to a print resolution when there is no printing involved?
MDN 的引用是错误的,因为它将 DPI 称为图像的分辨率。
(旁注:PPI 与 DPI 在物理特性上有所不同 - 但在这种情况下并不重要。你会看到我将 DPI 用于 PPI,因为自从我在 90 年代初开始使用它以来它已经根深蒂固)。
对您的问题的(有点)简短的回答是:
图像仅以像素为单位,没有真实世界大小的概念。 DPI 纯粹是任意的当保存为图像中的元数据时/与图像一起保存时,当传输到屏幕或纸张等物理介质(以及整个管道)时用作提示显示图像考虑其 DPI)。
至于原因:96 DPI 指的是“标准”(但不准确且有点过时)屏幕像素密度,因此如果您按原样将图像打印到纸上并保持将纸贴在屏幕上 纸上的内容应该与您在屏幕上看到的大小相匹配(大多数人不会 calibrate theirs screens 实际 DPI,如果不使用通用驱动程序,制造商有时会对他们的驱动程序草率,所以会有很小的误差)。
浏览器实际上不会将此信息存储在它生成的图像文件中(不需要,见下文)。
为了记录,让我们首先看一下 JPEG 文件的二进制文件:
从 Firefox 保存的 JPEG 十六进制转储,但 Chrome 的情况相同。
不,在位置 0x0D 处没有定义单位 (0)。这必须是 1(英寸)或 2(厘米)(当然没有 EXIF (0xffe1/APP1),因为没有相机/扫描仪生成图像)。
那么 PNG 呢?
从 Firefox 保存的 PNG 的十六进制转储,但 Chrome 的情况相同。
不,这里也没有。没有 pHYs
block ,IHDR
仅包含实际像素分辨率。
这没关系,因为图像假设在当今大多数系统上为 96 DPI,因此它没有任何后果(DPI 实际上用于影响图像,而没有其他 DPI/PPI 已定义)。
但在大多数情况下,对于你我来说,1920x1080 图像在 15"和 50"屏幕上都是 1920x1080。忽略...
总而言之:当您通过 Canvas 传递图像时,图像可能会嵌入一个提示,例如指示 300 DPI。这当然在保存 Canvas 时被剥离,但它不会改变图像分辨率(前提是 Canvas 与原始图像具有相同的像素分辨率)所以打印质量不会下降(通过 JPEG 压缩当然会影响一般质量,但对于实际分辨率没有变化)。
关于javascript - canvas.toDataURL() 不会改变图像质量。怎么会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436237/
问题很简单:看代码。两个静态断言都通过了。我不希望第二个通过。这是错误还是正常行为? #include #include template class Temp, class Specializ
int Sequence::scoreDegeneracy() { cout const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== b
我已经测试了下面的代码,除了第 29 行之外,一切都按照我的预期进行。final.write(invrow) 实际上并没有写入文件。当我使用简单的 print invrow 时,它显示没有问题。我没有
我的项目中有很多类被单例访问,如下所示: _inline GUI_BS_Map* GUI_GetBS_Map() { static GUI_BS_Map obj; return &ob
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我针对我遇到的问题截取了几张屏幕截图。基本上,我对 vi 的习惯和期望是能够使用箭头键在文档中移动,并且仍然能够阅读文档的实际内容。 Here is a shot of vi editor as I
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; [timeFormatter se
根据docs : The HTMLCanvasElement.toDataURL() method returns a data URI containing a representation of
我做了一个小函数,可以实际测量最大递归限制: def f(x): r = x try: r = f(x+1) except Exception as e:
我正在开发一个小型 silverlight 应用程序,该应用程序涉及在 javascript 和 silverlight 之间传递一些数据。我也在使用 silverlight 虚拟地球控件。 我遇到的
我在Chrome和Firefox中都试过了,浏览器好像没有问题。我的 CSS 是有效的,但是当我通过验证运行我的 HTML 时,它显示“元素链接上属性 rel 的错误值‘stylesheet’:字符串
如果我有一个类,其中的 ctor 设置为像这样的多重注入(inject): public Shogun(IEnumerable allWeapons) { this.allWeapons =
我现在正在使用 devise/omniauth。通过 facebook/twitter 注册后,我想重定向到一个名为“验证电子邮件”的页面,他们可以在其中验证他们的电子邮件地址是否正确。 我只是想让
我有两个相同的交易,在这种情况下发送相同数量的代币,导致实际消耗的气体不同(不是成本,而是显着差异)。 以下是 tx 哈希值: 0x2cbb4b35d87cabe1a7b7bcb562e4e046e9
如果我这样做: ExpiresActive On ExpiresDefault "access plus 30 days" 它没有正确设置 Expire header
我无法过滤我想要查看的特定软件包,因为 cpusettings 菜单呈灰色。 我正在使用 VisualVM 运行程序从 eclipse 运行我的应用程序。 最佳答案 采样过程中无法更改 CPU 设置。
在 http://www.gwtproject.org/doc/latest/DevGuideUiBinder.html 它指出要在 uiBinder 模板中使用小部件: they must be d
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我有下面的代码,但是,当我用 visual studio code 修改代码并在我的 Chrome 浏览器中运行它时,我在“热门产品”中看不到下拉菜单。部分。 但是,当我在此处 (stackoverf
我有两个类(class)联系人和群组 FirstName 和LastName 的组合必须是唯一的,并且可以为单个联系人添加多个地址。我如何在 Entity Framework 代码优先方法中做到这一点
我是一名优秀的程序员,十分优秀!