JavaScript画布图像数据操作
我想调整图像大小使用非常简单的算法。我有这样的想法:JavaScript画布图像数据操作,javascript,image,canvas,image-resizing,getimagedata,Javascript,Image,Canvas,Image Resizing,Getimagedata,我想调整图像大小使用非常简单的算法。我有这样的想法: var offtx = document.createElement('canvas').getContext('2d'); offtx.drawImage(imageSource, offsetX, offsetY, width, height, 0, 0, width, height); this.imageData = offtx.getImageData(0, 0, width, height).data; offtx.clearRe
var offtx = document.createElement('canvas').getContext('2d');
offtx.drawImage(imageSource, offsetX, offsetY, width, height, 0, 0, width, height);
this.imageData = offtx.getImageData(0, 0, width, height).data;
offtx.clearRect(0, 0, width, height);
for(var x = 0; x < this.width; ++x)
{
for(var y = 0; y < this.height; ++y)
{
var i = (y * this.width + x) * 4;
var r = this.imageData[i ];
var g = this.imageData[i+1];
var b = this.imageData[i+2];
var a = this.imageData[i+3];
offtx.fillStyle = "rgba("+r+","+g+","+b+","+(a/255)+")";
offtx.fillRect(0.5 + (x * this.zoomLevel) | 0, 0.5 + (y*this.zoomLevel) | 0, this.zoomLevel, this.zoomLevel);
}
}
this.imageData = offtx.getImageData(0, 0, this.width * this.zoomLevel, this.height * this.zoomLevel);
然而,这个解决方案的问题是,图像以这种方式失去了任何透明度信息。我不知道这种情况是否发生在这个算法中,或者我稍后用来显示图像的putImageData正在这样做,但我似乎无法保持透明度
每次我创建画布时,我都会将图像放在画布上,并使用getImageData从该画布获取图像,正如您在代码的第一行中看到的那样。也许没有别的办法,所以我可能不介意
但问题是我使用两个for循环来绘制调整大小的图像,然后使用getImageData来存储图像信息。这是一种非常巧妙的方法。我更喜欢创建空的图像数据,并填充所有的原始图像信息只调整大小。我不能用我的头脑去理解,我不能想象这个循环的结构。为了说明我的意思:
for(var x = 0; x < this.width; ++x)
{
for(var y = 0; y < this.height; ++y)
{
var i = (y * this.width + x) * 4;
var r = this.imageData[i ];
var g = this.imageData[i+1];
var b = this.imageData[i+2];
var a = this.imageData[i+3];
//I WOULD LIKE MAGIC TO HAPPEN HERE THAT WILL
//RESIZE THAT CURRENT PIXEL AND MOVE IT TO THE NEW IMAGE DATA RESIZED
//SO EVERYTHING IS DONE NICE AND CLEAN IN THIS LOOP WITHOUT THE
//GETIMAGEDATA LATER AND MAYBE SET TRANSPARENT PIXELS WHILE I'M AT IT
}
}
我想不出有什么神奇的地方
谢谢你的阅读 为什么不使用内置的drawImage并禁用图像平滑功能?在循环中执行此操作不仅相对较慢,而且容易出错,正如您已经发现的那样 按以下方式进行操作将为您提供像素艺术外观,并保留alpha通道:
var factor = 4; /// will resize 4x
offtx.imageSmoothingEnabled = false; /// prefixed in some browsers
offtx.drawImage(imageSource, offsetX, offsetY, width, height,
0, 0, width * factor, height * factor);
以下是。尝试使用我最近制作的这个库,它可以加载图像,调整图像大小,固定宽度和高度,或者使用前页 它完全满足您的需要,更像是将画布转换为base64、blob等
var CanvaWork = new CanvaWork();
CanvaWork.canvasResizeAll(obj.canvas, function(canvases){
// "canvases" will be an array containing 3 canvases with different sizes depending on initial options
});
希望这对你有帮助 单个像素不会调整为更小的大小。你需要做的是取一组,比如说,4个像素,取它们的平均颜色,然后在新的阵列/画布上添加一个平均颜色的像素。我将在100%的情况下增加图像的大小,而不是减少。此外,我将始终调整它的整数,如x2,x4等。这是为像素艺术。对不起,我应该提一下。