2

ピクセル操作の習慣を身に付けようとしているだけで、何も変わりません。

次のループを使用して、各ピクセルを反転します。

var newImage = context.createImageData(canvas.width, canvas.height);
var arr = context.getImageData(0, 0, canvas.width, canvas.height);
var pixels = arr.data;

for(var i = 0; i < pixels.length; i+=4){
    var r = 255 - pixels[i];
    var g = 255 - pixels[i + 1];
    var b = 255 - pixels[i + 2];
    var a = pixels[i + 3];
    newImage.data[i] = r;
    newImage.data[i + 1] = g;
    newImage.data[i + 2] = b;
    newImage.data[i + 3] = a;
}

それでも、キャンバスをクリアして書き直そうとしても、何も起こりません:

context.clearRect(0, 0, canvas.width, canvas.height);
context.putImageData(newImage, 0, 0);

なぜこれが機能しないのですか?私は何を間違っていますか?

jsfiddle

4

1 に答える 1

2

問題は画像に由来します(まだロードされていません)。あなたのコードは動作します (画像なしでこのフィドルを見てください - http://jsfiddle.net/B82nk/1/ )。

次のようにする必要があります。

var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
canvas.width = 500;
canvas.height = 322;

var image_obj = new Image(); 
image_obj.onload = function(){
    var newImage = context.createImageData(canvas.width, canvas.height);
    var arr = context.getImageData(0, 0, canvas.width, canvas.height);
    var pixels = arr.data;

    for(var i = 0; i < pixels.length; i+=4){
        var r = 255 - pixels[i];
        var g = 255 - pixels[i + 1];
        var b = 255 - pixels[i + 2];
        var a = pixels[i + 3];
        newImage.data[i] = r;
        newImage.data[i + 1] = g;
        newImage.data[i + 2] = b;
        newImage.data[i + 3] = a;
    }

    context.clearRect(0, 0, canvas.width, canvas.height);
    context.putImageData(newImage, 0, 0);
}

image_obj.src = 'http://www.johnchapple.com/jcwp/wp-content/uploads/2012/09/photography_quotes.jpg';
于 2013-09-29T16:53:21.597 に答える