用JavaScript修改Canvas图片的分辨率(DPI)

应用场景:

仓库每次发货需要打印标签, Canvas根据从数据库读取的产品信息可以生成标签JPG, 但是这个JPG图片的默认分辨率(DPI)是72

这个DPI太低, 导致打印出来的图片会很模糊.

修改DPI的常规做法是把图片上传到服务器用C#修改DPI后再下载到服务端

但是心里觉得很憋屈, 分明已经在客户端生成了图片, 仅仅为了修改一个很小的标记(DPI信息只是JPEG格式的一个头部META)要上传一张很大的图片到服务端折腾一遭.

 

后来使用了下面的方法

用JavaScript直接修改了DPI

这里不贴源码, 仅提供解决思路, 希望需要的朋友自己亲手试一下

既然知道DPI只是JPEG格式的头部信息, 并且是很小的一部分, 而base64属于流编码, 那么canvas.toDataURL()以后的base64字符串中, 这个DPI信息所处的位置应该也是固定的

  1. 用图片处理程序(我用的是Fireworks)生成两张内容一样的JPG图片, 仅修改其DPI, A图片的DPI是72, B图片的DPI是300
    这里为了确认起见, 使用UE对比一下两个文件, 确实只有头部几个字节不一样
  2. 用C#读取A/B图片, 分别编码成BASE64, 生成A.txt和B.txt
  3. 用UE或其他文本编辑器对比两个文本文件, 找出不一样的部分, 你会发现只有靠近头部的不到10个字符不一样
  4. 重复以上实验, 用不同的图片, 会发现最后总是那固定的几个字符不一样, 并且只要DPI一样, 那固定位置的几个字符也是一样的
  5. 在浏览器端用canvas.toDataURL生成jpg图片的base64字符, 然后修改字符中刚才固定位置的字符为测试时DPI为300的特征字符

OK, 现在你已经获得了一个DPI为300的JPG图片了.

 

有兴趣的朋友可以去研究一下BASE64编码, 然后做成一个函数来计算不同DPI所对应的特征字符

至于二进制状态的那几个自己, 用计算器按一下就会发现那就是直接存储的DPI数值

 

MORE:

在公司的项目中, 操作人员每次不同批次的图片会习惯于保存在一个固定的文件夹里, canvas生成的图片另存为的时候默认文件名总是 canvas.jpg

这里如果使用它们所习惯的批次号.jpg作为保存的默认文件名体验会好很多

这里有两种方案,

  1. 去Google找一个叫做downloadify的Flash组件, 可以保证点击"下载"按钮的时候跳出一个选择保存位置的对话框, 并且默认的文件名可以用js指定
  2. 使用HTML5的download属性加在A标签里, 这个方案更简单, 不过Firefox/Chrome会直接保存到默认下载位置, 不会让用户选择, 而右键另存为又会失去默认文件名的作用

两种方案各有利弊吧, 具体看操作人员的使用习惯

 

转载于:https://www.cnblogs.com/xiarugu/p/canvas-dpi.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改Canvas分辨率,你可以通过设置Canvas的宽度和高度属性来实现。下面是一个修改Canvas分辨率的示例: ```vue <template> <canvas ref="canvas"></canvas> </template> <script> export default { mounted() { this.resize(); this.draw(); }, methods: { resize() { const canvas = this.$refs.canvas; const ctx = canvas.getContext('2d'); const devicePixelRatio = window.devicePixelRatio || 1; // 获取Canvas元素在浏览器中的显示尺寸 const width = canvas.clientWidth; const height = canvas.clientHeight; // 根据设备像素比例调整Canvas的实际尺寸 canvas.width = width * devicePixelRatio; canvas.height = height * devicePixelRatio; // 缩放Canvas绘图上下文,以适应高分辨率屏幕 ctx.scale(devicePixelRatio, devicePixelRatio); }, draw() { const canvas = this.$refs.canvas; const ctx = canvas.getContext('2d'); // 在这里进行绘图操作 } } } </script> ``` 在上面的示例中,我们在`mounted`钩子函数中添加了`resize`方法来调整Canvas分辨率。首先,我们获取Canvas元素在浏览器中的显示尺寸,并根据设备像素比例调整Canvas的实际尺寸。然后,我们使用`scale`方法缩放Canvas绘图上下文,以适应高分辨率屏幕。 接下来,你可以在`draw`方法中进行绘图操作,根据修改后的分辨率进行绘制。注意,在进行绘图操作时,你需要考虑到Canvas的实际尺寸和显示尺寸的差异。 希望这个示例能够帮助你修改Canvas分辨率。如果你还有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值