如何将图像转换为像素,编辑它,并在 Javascript 中绘制编辑后的图像

Un1*_*Un1 5 javascript

我对 JS 完全陌生,我想学习如何执行以下操作:

获取图像数据(将其转换为像素数组,以便我可以对其进行编辑),然后从像素编辑功能返回已编辑的数组,以便我可以使用这些已编辑的值来绘制已编辑的图像。

我什至不确定这是否是解决这个问题的方法,但这是我到目前为止所得到的:

  var img = new Image();
      img.src = 'img.png';
      var canvas = document.getElementById('canvas');
      var canvasEdited =  document.getElementById('canvasEdited');
      var ctx = canvas.getContext('2d');
      var arr = [];
      img.onload = function() {
          ctx.drawImage(img, 0, 0);
          function editPixels(ctx) {
             for (i of ctx) {
                 // edit pixels values 
                 arr.push(i - 10);    
             }
          }
          console.log(arr);
          function drawEditedImage() {
             var ctxEdited = canvasEdited.getContext('2d');
             ctxEdited.drawImage(img, 0, 0);
          }
     };
Run Code Online (Sandbox Code Playgroud)

控制台输出显示一个带有length:0.

为什么不将编辑后的像素推送到arr

Zom*_*mry 6

我的速度不如其他人,但我还是决定发布我的答案,因为它仍然有一些附加值(崩溃、base64、污染的画布提及......)。

我假设您想通过画布更改图像的像素数据。

首先,将图像渲染到画布上。你已经说对了:

var canvasEdited =  document.getElementById('canvasEdited');
var ctxEdited = canvasEdited.getContext('2d');
ctxEdited.drawImage(img, 0, 0, canvasEdited.width, canvasEdited.height);
Run Code Online (Sandbox Code Playgroud)

然后,取出像素数据:

var imageData = ctxEdited.getImageData(0, 0, canvasEdited.width, canvasEdited.height);
// you will get an array of pixel data
// this array consists of rgba values
// each 'set' of four stands for red, green, blue and alpha
Run Code Online (Sandbox Code Playgroud)

然后,用它做一些事情,在本例中将其设置为灰色:

for(var i = 0; i < imageData.length; i += 4) {
    var brightness = 0.34 * imageData[i] + 0.5 * imageData[i + 1] + 0.16 * imageData[i + 2];
    imageData[i] = brightness;
    imageData[i + 1] = brightness;
    imageData[i + 2] = brightness;
}
Run Code Online (Sandbox Code Playgroud)

然后,将更改后的像素数据绘制回画布上:

ctxEdited.putImageData(imageData, 0, 0);
Run Code Online (Sandbox Code Playgroud)

如果您想在画布外重复使用该图像,可以将其转换为 base64,如下所示M

var base64URI = canvasEdited.toDataURL();
Run Code Online (Sandbox Code Playgroud)

然后,您可以将该数据设置为元素的源,如下所示:

img.src = base64URI;
Run Code Online (Sandbox Code Playgroud)

注意事项:


kar*_*ick 4

有很多问题需要解决。如果您想从画布获取图像数据,则图像需要位于同一域中。更容易修复的是 base64 格式。不是网址。因此,将您的图像转换为 base64 字符串。

您不会在任何地方调用编辑像素,即使您在某个地方调用它并且在问题中没有提及,形成您的参数命名清楚表明您正在传递上下文而不是图像数据。

使用 getImageData 和 putImageData 在画布中获取和设置数据。

For 循环需要更改,以便您不会在 alpha 数据上设置负值。图像数据的格式为rgba。

因为你没有提到如何操纵像素。我只是将 RGB 值减少 100,以显示原始图像和新图像之间的差异。

var img = new Image();
      img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsBAMAAACLU5NGAAAAG1BMVEXMzMyWlpa3t7eqqqqcnJyjo6PFxcWxsbG+vr6NAD6nAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACjklEQVR4nO3XO2/bMBDA8fNTGn2OlGS00S8QAWnnaKi7xnBQdJSBFl3joY/RRpHv3SNFykYtdKOm/w8BHOkOIM3HkRYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/uddvWvsI38sj+7xT/2lJ2n8WH64iMbkdCaqurTPteqda98eX6+zKnu9OkdDckIH3W21kbmWlR5F9rrT+6ukTMv3ettFY3JC9UZyfZBJ0czrZxuWjXwtr5KmRSOnmy4ak9PJ3bc+PMveJvJ0a+OwslfNv1knG6Ks7KIhOaGxulYXsl7YmNy1j/XV4nLRXLtoSE4oczN2epLK5mRSuj/x/7tuPImfOfHDKXnRRUNyaq6l17bhu7aX/q1N1fY8Va7TIRqSE/tuS2a78i3Nludu7QsbsW4+54dlFw3JadVqM1Uf3b6XqSsO+4V/n+nrtGt7qrZdYzQkp6WuFLUtNW3DYebqzXoZk0ZqWzZGQ3LqblmLvhFtRq5Ho9Ct9c25OI1c52M0JKftlrzpc+9ozfSilOfbctjRsv226FtbtuBvLpJmOuza8hW7Zyfa4lpeJFl5H24nZr/Fz4srReNQt9ahW5nGpn8d/azFaEhOyJ8hNi+HtnBn5yrvClcsW+44slmL0UPyKj8Jh0/fmVjd12HxV+3hM+CZ6DZUFW4Q9+GOcPShuT6sw5o/3PovEKMhOaG5frZBWPXdt2a2xkMV2JeNuNI62H1LqmJXF9J3O7XbQ65t4xP9+OguFMPdTr9Zkd9I313eLaxt28X5VtUuqAPe5eVH/ckalPyl/THzFn/5jF0H9qEMZC/Fz4toTAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEjpL514clJrNSt2AAAAAElFTkSuQmCC';
      var canvas = document.getElementById('canvas');
      var canvasEdited =  document.getElementById('canvasEdited');
      var ctx = canvas.getContext('2d');
      var arr = [];
      img.onload = function() {
          ctx.drawImage(img, 0, 0);

          var imageData = ctx.getImageData(0,0, canvas.width, canvas.height)

           editPixels(imageData.data);

           drawEditedImage( imageData);
     };

     function editPixels(imgData) {
              for (var i=0; i < imgData.length; i += 4) {
                  imgData[i] = imgData[i] - 100;
                imgData[i+1] = imgData[i+1] - 100;
                imgData[i+2] = imgData[i+2] - 100;
             }
     }

     function drawEditedImage(newData) {
         var ctxEdited = canvasEdited.getContext('2d');
         ctxEdited.putImageData(newData, 0, 0);
     }
Run Code Online (Sandbox Code Playgroud)

jsfiddle 相同的 https://jsfiddle.net/karthick6891/3yhyyLyf/