gpt4 book ai didi

Javascript 图像处理?逐个像素

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:19:20 24 4
gpt4 key购买 nike

有没有一种方法或库可以在 javascript 中逐像素获取图像颜色数据?我需要阅读大量的 OMR 表格,并且我想在客户端而不是在我的服务器上进行阅读:D。因此,如果我可以获得原始数据,我可以使用 javascript 构建系统,或者我必须构建一个我根本不喜欢的桌面应用程序。谢谢

最佳答案

当然,不需要使用库。通过 canvas 非常简单。

img -> canvas -> magic -> canvas -> img

你需要做的是:

  1. 创建<canvas>
  2. 获取 Canvas context
  3. 复制imgcanvas
  4. 获取 Canvas image data (一组值 [r,g,b,a,r,g,b,a,r,g,..] )
  5. 做 `The magic`®
  6. image data返回
  7. 把改变canvas返回<img>

处理 Canvas 的代码

var cvs = document.createElement('canvas'),
img = document.getElementsByTagName("img")[0]; // your image goes here
// img = $('#yourImage')[0]; // can use jquery for selection
cvs.width = img.width; cvs.height = img.height;
var ctx = cvs.getContext("2d");
ctx.drawImage(img,0,0,cvs.width,cvs.height);
var idt = ctx.getImageData(0,0,cvs.width,cvs.height);

// usage
getPixel(idt, 852); // returns array [red, green, blue, alpha]
getPixelXY(idt, 1,1); // same pixel using x,y

setPixelXY(idt, 1,1, 0,0,0,255); // a black pixel

6,7、修改图片...

ctx.putImageData(idt, 0,0);  // 0,0 is xy coordinates
img.src = cvs.toDataURL();

想知道 Canvas 在哪里?

document.body.appendChild(cvs);

一些神奇的功能

image data是一组连续的 r,g,b,a,r,g,..值和一个像素由 4 个值组成,则需要重新计算索引。公式很简单:data[(y*width + x)*4 + ch] , 其中ch介于 0 之间和 3对于 r,g,b,a channel 。

请注意,下面有更简洁且更快的解决方案。

function getPixel(imgData, index) {
var i = index*4, d = imgData.data;
return [d[i],d[i+1],d[i+2],d[i+3]] // [R,G,B,A]
}

function getPixelXY(imgData, x, y) {
return getPixel(imgData, y*imgData.width+x);
}

function setPixel(imgData, index, r, g, b, a) {
var i = index*4, d = imgData.data;
d[i] = r;
d[i+1] = g;
d[i+2] = b;
d[i+3] = a;
}

function setPixelXY(imgData, x, y, r, g, b, a) {
return setPixel(imgData, y*imgData.width+x, r, g, b, a);
}

2019 年更新 Uint8ClampedArray

您可以使用这个 subarray 直接操作像素数据“查看”subarray不同于slice或来自前面的示例,因为它不会创建数组的浅拷贝,而是创建一个共享同一存储区的数组。

阅读更多信息 MDN:Uint8ClampedArray .

function getPixel(imgData, index) {
return imgData.data.subarray(index*4, index*4+4) // Uint8ClampedArray(4) [R,G,B,A]
}

let px = getPixelXY(idt, 0, 0)
px[0] = 255

// ctx.putImageData(idt,0,0); // makes the pixel reddish

function getPixel(imgData, index) {
return imgData.data.slice(index*4, index*4+4) // [R,G,B,A]
}

function setPixel(imgData, index, pixelData /*[R,G,B,A]*/) {
imgData.data.set(pixelData, index*4)
}

关于Javascript 图像处理?逐个像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5867723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com