reactjs 将280x280像素图像转换为28x28像素图像的方法,(不显示图像,只是更改文件)[已关闭]

d5vmydt9  于 2023-01-04  发布在  React
关注(0)|答案(1)|浏览(132)

16小时前关门了。
Improve this question
我正在做一个项目,我有一个用户的图像,格式是data:image/png,我需要一个28x28的图像,我正在尝试将用户的280x280图像转换成28x28,然后转换成一个784x1的数组。
我试过很多软件包,似乎都不起作用。

t98cgbkg

t98cgbkg1#

如果你在浏览器环境中,有一个描述图像的data: URL,你不需要一个包。

  • 让浏览器解析URL并将其读取为带有i = new Image()i.addEventListener("load", listener)i.src = 'data:...'的图像。
  • listener中,创建一个canvas = new HTMLCanvasElement(),并将其尺寸(widthheight)设置为28 x28。该元素不需要在文档中,我们只需要使用它来绘制东西。
  • 调用ctx = canvas.getContext("2d")以获取2D绘图画布。
  • 调用ctx.fillRect(0, 0, 28, 28)将画布填充为纯色,以防用户的图像包含您不关心的alpha通道(如果您不喜欢黑色,请先设置fillColor)。
  • 调用ctx.drawImage(i, 0, 0, 28, 28)将原始图像绘制到上下文中。
  • 调用ctx.getImageData(0, 0, 28, 28)以获取描述图像的ImageData对象。
  • ImageData对象的data现在是一个28 * 28 * 4 = 3136字节的数组,按RGBARGBARGBA...顺序排列。(28 * 28 * 1)字节,因此选择通道(0,1,2),并以该偏移量和跨距4复制到784字节的Uint8ClampedArray,或者每3个字节取平均值以获取RGB图像数据的惰性灰度。(要获得更正确的灰度,请使用v = 0.299 * r + 0.587 * g + 0.114 * b作为YUV亮度刻度。)
  • 将生成的784字节数组放在需要的位置。

(既然你提到你正在使用Tensor,而且28 x28听起来很像MNIST图像,如果它看起来像是白色的,你可能想添加额外的逻辑来反转灰度; MNIST图像是黑底白字的,如果它们不一样,你会得到奇怪的结果。)

相关问题