【发布时间】:2022-01-25 13:14:07
【问题描述】:
我编写了一个从图像中提取像素颜色的网站。我通过在包含图像的画布上使用getImageData 来做到这一点。但是,我无法获得 this sample image 的正确值。
例如,当使用 Pillow 提取第一个像素颜色 (x=0, y=0) 时,它会为 RGBA 颜色空间返回 (49, 97, 172, 255)。
from PIL import Image
im = Image.open('image.png').convert('RGBA')
pix = im.load()
print(pix[0, 0])
Java 也给了我同样的结果:
BufferedImage bufferedImage = ImageIO.read(new File("image.png"));
int rawRGB = bufferedImage.getRGB(0, 0);
Color color = new Color(rawRGB);
但是,当我使用 HTML 画布时,我通过 getImageData 获得以下值:(27,98,178,255)。
let image = new Image();
const reader = new FileReader();
image.addEventListener('load', function () {
let canvas = document.createElement('canvas');
let ctx = canvas.getContext("2d");
canvas.width = this.width;
canvas.height = this.height;
ctx.drawImage(this, 0, 0);
let data = ctx.getImageData(0, 0, 1, 1).data;
document.getElementById('imageData').innerHTML = data;
});
image.addEventListener('load', function () {
let canvas = document.createElement('canvas');
let gl = canvas.getContext("webgl2");
gl.activeTexture(gl.TEXTURE0);
let texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
const framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this);
gl.drawBuffers([gl.COLOR_ATTACHMENT0]);
let data = new Uint8Array(1 * 1 * 4);
gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, data);
document.getElementById('webGl').innerHTML = data;
});
reader.addEventListener('load', (event) => {
image.src = event.target.result;
});
var fileToRead = document.getElementById("yourFile");
fileToRead.addEventListener("change", function (event) {
var files = fileToRead.files;
if (files.length) {
reader.readAsDataURL(event.target.files[0]);
}
}, false);
<pre>Expected: 49,97,172,255<br>
ImageData: <span id="imageData"></span><br>
WebGL: <span id="webGl"></span><br></pre>
<input type="file" id="yourFile" name="file">
我不明白为什么会发生这种情况,也不明白浏览器是如何得出这些值的。我已经尝试过 Chrome 和 Firefox,它们显示的值相同。我已经读过premultiplied alphas,但我不知道这会如何影响我的结果,因为图片没有使用 alpha 通道。任何帮助将不胜感激!
【问题讨论】:
-
这很可能是由于浏览器中的缩放。你的图片是 6016x6016,画布可能更小,所以浏览器需要缩放,随着像素的移动,一些像素会完全消失。
-
您是否介意我们使用 stackoverflow 的 imgur 帐户存储您的图像,以便将来的读者也可以访问它,即使您将其从 GDrive 中删除?
-
@Kaiido 请继续这样做。我只是不知道该怎么做,因为图像很大
-
哦,你说得对,它对 imgur 来说太大了,我不得不调整图像大小,然后他们将其转换为 JPEG(幸运的是保留了颜色配置文件),所以我更改了值。
标签: javascript html image canvas html5-canvas