2013-09-26 16 views
10

グレースケールに変換したいpng画像があります。私はそれをグレースケールに変換することができましたが、イメージの透明なアールの色も変わりました。 画像の透過領域を変更せずに色を変更するにはどうすればよいですか?画像の色をhtml5でグレースケールに変更

var canvas = document.getElementById('canvas'); 
var ctx = canvas.getContext('2d'); 
var img = new Image(); 
img.src = 'image.png'; 
ctx.drawImage(img, 0, 0); 

var imageData = ctx.getImageData(0, 0, 420, 420); 
var px = imageData.data; 

var len = px.length; 

for (var i = 0; i < len; i+=4) { 
    var redPx = px[i]; 
    var greenPx = px[i+1]; 
    var bluePx = px[i+2]; 
    var alphaPx = px[i+3]; 

    var greyScale = redPx * .3 + greenPx * .59 + bluePx * .11; 

    px[i] = greyScale; 
    px[i+1] = greyScale; 
    px[i+2] = greyScale; 
    px[i+3] = greyScale; 
} 

ctx.putImageData(imageData, 0, 0); 
+0

完全にはサポートされていませんが、正確な質問には答えられていませんが、提供されるソリューションは標準に優しいため、クロムでは '-webkit-filter:grayscale(100%)' – andy

答えて

9

アルファは「色ではありません」です。透明部分を透明なままにして、そのままコピーする必要があります。ただ、行を削除します。

px[i+3] = greyScale; 
1

私はこれの目的について完全にはわからないですが、質問にもタグ付けされているので、「HTML5は、」私はそれは、例えばよりさまざまな目的のために必要なことかもしれないと仮定画像操作ライブラリ。これがイメージエディタやHTML5ゲームではなく、一部の画像をグレースケールに変換するだけでよい場合などです。ホバー上で、あなたにもCSSを使用することがあります。

.grayscale { 
    filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+, Firefox on Android */ 
    filter: gray; /* IE6-9 */ 
    -webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ 
} 

ことが適切でない場合は、あなたが

+0

+1を使用できます。元の問題自体よりも。 – opalenzuela

0

にこのプラグイン(tancolor.jsを)これを実行する必要があります理由の詳細を投稿してください同じようなことことありません達成したい場合は、source codeをチェックして、intractive demoを試してみてください。

関連する問題