1

我似乎无法弄清楚如何在 html5 画布上缩放像素。这就是我到目前为止的位置。

function draw_rect(data, n, sizex, sizey, color, pitch) {
    var c = Color2RGB(color);
    for( var y = 0; y < sizey; y++) {
        var nn = n * 4 * sizex;

        for( var x = 0; x < sizex; x++) {
            data[nn++] = c[0];
            data[nn++] = c[1];
            data[nn++] = c[2];
            data[nn++] = 0xff;
        }
        n = n + pitch;;
    } 
}

function buffer_blit(buffer, width, height) {
    var c_canvas = document.getElementById("canvas1");
    var context = c_canvas.getContext("2d");
    context.scale(2, 2);
    var imageData = context.getImageData(0, 0, context.canvas.width, context.canvas.height);
    var n = width * height - 1;
    while((n--)>=0) draw_rect(imageData.data, n, pixel, pixel, buffer[n], width);

    context.putImageData(imageData, 0, 0);  
}

编辑:我在这里更新了代码。不确定发生了什么变化。

也许一些图像会有所帮助。第一个图像的像素大小为 1,第二个像素大小为 2。请注意,图像会加倍并且仅填充画布的一半。

像素大小为 1

像素大小为 2

Edit2:我制作了一个网页,至少显示了我正在经历的一种奇怪行为。

活生生的例子

4

2 回答 2

3

drawImage 可用于在不使用 ImageData 的情况下缩放任何图像或类似图像的事物(或例如)——除非您明确想要处理特定于像素的缩放,否则您可能应该使用本机支持。例如。

var myContext = myCanvas.getContext("2d");
// scale image up
myContext.drawImage(myImage, 0, 0, myImage.naturalWidth * 2, myImage.naturalHeight * 2);
// scale canvas up, can even take the source canvas
myContext.drawImage(myCanvas, 0, 0, myCanvas.width * 2, myCanvas.height * 2);
// scale up a video
myContext.drawImage(myVideo, 0, 0, myVideo.width * 2, myVideo.height * 2);

或者你可以这样做:

myContext.scale(2, 2); // say
//.... draw stuff ...
myContext.scale(.5, .5);

取决于你的确切目标。

于 2011-04-02T22:26:39.417 回答
0

您可以暂时使用带有 的图像canvas.toDataURL(),然后使用 调整大小来绘制它drawImage()

context.putImageData()应该可以解决问题,但尺寸参数尚未在 Firefox 中实现

代码,带有两个用于演示目的的画布:

var canv1 = document.getElementById("canv1"),
    canv2 = document.getElementById("canv2"),
    ctx1  = canv1.getContext("2d"),
    ctx2  = canv2.getContext("2d"),
    tmpImg = new Image();

/* Draw the shape */
ctx1.beginPath();
ctx1.arc(75,75,50,0,Math.PI*2,true);
ctx1.moveTo(110,75);
ctx1.arc(75,75,35,0,Math.PI,false);
ctx1.moveTo(65,65);
ctx1.arc(60,65,5,0,Math.PI*2,true);
ctx1.moveTo(95,65);
ctx1.arc(90,65,5,0,Math.PI*2,true);
ctx1.stroke();

/* On image load */
tmpImg.onload = function(){
  /* Draw the image on the second canvas */
  ctx2.drawImage(tmpImg,0,0, 300, 300);
};
/* Set src attribute */
tmpImg.src = canv1.toDataURL("image/png");

编辑:olliej 是对的,不需要使用临时图像

于 2011-04-02T22:01:20.963 回答