ImageData翻转图片javascript

时间:2017-07-15 14:20:11

标签: javascript canvas

如何将ImageData对象中包含的图像旋转45度?

https://developer.mozilla.org/en/docs/Web/API/ImageData

我不想用画布我只想要ImageData。

1 个答案:

答案 0 :(得分:1)

扫描线渲染。

为什么在imageData?它很慢

您可以使用扫描线渲染器。这将逐行扫描新的(目标),计算该点像素的x,y坐标,然后设置颜色以匹配。

该示例通过图像数据阵列旋转图像。设置旋转量和旋转中心,并创建一个非常简单的矩阵(ax,ay,ox,oy),将扫描像素(x,y)旋转到查找像素(rx,ry)。解决方案是最近邻查找,但您可以通过rx,ry像素位置的小数余数解释像素颜色来创建双线性或三等。



const ctx = canvas.getContext("2d");
const randI = (min, max = min + (min = 0)) => (Math.random() * (max - min) + min) | 0;
const doFor = (count, cb) => { var i = 0; while (i < count && cb(i++) !== true); }; 


doFor(150,i=>{
  ctx.fillStyle = "hsl("+randI(360)+",100%,50%)";
  ctx.fillRect(randI(canvas.width),randI(canvas.height),randI(10,20),randI(10,20));
});
ctx.font = "28px Arial black";
ctx.textAlign = "center";
ctx.fillStyle = "black";
ctx.strokeStyle = "white";
ctx.lineWidth = "5";
ctx.lineJoin = "round";
ctx.strokeText("Rotate me!",128,128);
ctx.fillText("Rotate me!",128,128);


// the rotation origin    
const ox = 128;
const oy = 128;
// the rotation amount
const rot = Math.PI / 4; // 45 deg
// the rotated x axis
const ax = Math.cos(rot); // 45 deg
const ay = Math.sin(rot); // 45 deg
// get the source pixel data
const imageData = ctx.getImageData(0,0,256,256);
const d32 = new Uint32Array(imageData.data.buffer);
// create a destination pixel array
const rotImageData = new Uint32Array(imageData.data.length/4);
// scan each pixel and row adding pixels to rotImageData from the transformed
// x,y coordinate.
for(y = 0; y < 256; y += 1){
  for(x = 0; x < 256; x += 1){
    const ind = (x + y * 256);
    // transform the current pixel to the rotated pixel
    const rx = (x - ox) * ax - (y-oy) * ay + ox;
    const ry = (x - ox) * ay + (y-oy) * ax + oy;
    // use nearest pixel lookup and get index of original image
    const ind1 = ((rx | 0) + (ry | 0) * 256);
    rotImageData[ind] = d32[ind1];
  }
}
// create a second canvas
var c1 = document.createElement("canvas");
c1.width = 256;
c1.height = 256;

var ctx1 = c1.getContext("2d"); 
// put the new image data into the imageData array
d32.set(rotImageData);
// and put that on the new canvas
ctx1.putImageData(imageData,0,0);
// add the canvas to the page
document.body.appendChild(c1);


    
    
  
&#13;
canvas {border : 2px solid black;}
&#13;
<canvas id="canvas" width=256 height=256></canvas>
&#13;
&#13;
&#13;