2011-10-25 15 views
4

HTML5キャンバス要素の画像の色深度を変更する方法があるかどうかは、画像の各ピクセルの色が最も近いより少ない色のビット深度では等価である。ありがとうございました。Html5キャンバス要素の色の深度を変更

+0

単にユーザーの画面設定に依存していませんか? – feeela

+0

私は実際に "低レズ"エフェクトを作成するためにイメージデータにしたいと思っています。 – KeithComito

答えて

9

はい、実行できますが、それほど難しくありません。ここに私の答えを参照してください:How can I use a gradient map to tone a HTML5 canvas with an image in the canvas.

だけ着色のように、単にあなたがしなければならないすべては、各ピクセルの上に行くと低いことをRGBの値を変更している(1の8つのまたは16の代わりに、ステップの手順)

ので、あなたができる8つのステップのために:

redValue = redValue - (redValue % 32) // 155 would become 128, etc 

あなたはうまくいくはずですが、エッジのケースをチェックする必要があります。

例:

http://jsfiddle.net/gbBz7/

+0

+1より簡単な式。あまりに複雑すぎると思っていた。 – pimvdb

+0

驚くばかり。これは非常に便利です。しかし、クイック質問。キャンバスは、デフォルトでは32ビットのビット深度です。この例では32/4 = 8ビットの深さに減らしていますか?それとも間違って考えていますか?再度、感謝します! – KeithComito

1

getImageDataで各色の各バイトを繰り返し処理できるので、いくつかの数学関数を適用することができます。 8-bit colorshttp://jsfiddle.net/pimvdb/eGjak/191/を表します。

var imgdata = ctx.getImageData(0, 0, 400, 400); // get data 
var data = imgdata.data; // bytes 

// 8-bit: rrr ggg bb 
for(var i = 0; i < data.length; i += 4) { 
    data[i]  = nearest(data[i],  8); // set value to nearest of 8 possibilities 
    data[i + 1] = nearest(data[i + 1], 8); 
    data[i + 2] = nearest(data[i + 2], 4); 
} 

ctx.putImageData(imgdata, 0, 0); // put image data to canvas 

function nearest(x, a) { // will round down to nearest of a possibilities 
         // in the range 0 <= x <= 255 
    return Math.floor(x/(255/a)) * (255/a); 
} 
+0

いいえ。それが私が想像していたものです。私はちょっと、「色の濃さを変える」のような、あらかじめ定義された機能があると思っていました。 – KeithComito

+0

@ user201926:申し訳ありませんが、何かが...黒/白に設定されていました。編集:これは私が願って良いはずです。 – pimvdb

3

私はこのために設定してそこに構築されたとは思いません。しかし、各ピクセルチャネルの値をより限定された値のセットに減らすことができるはずです。次のようなものがあります:

var ctx, width, height; 
var factor = 8; 
var pixels = ctx.getImageData(0, 0, width, height).data; 

function reduce(val) { 
    return Math.round(val/factor)*factor; 
} 

for(var i = 0, l = pixels.length; i < l; i+=4) { 
    pixels[i] = reduce(pixels[i]); 
    pixels[i+1] = reduce(pixels[i+1]); 
    pixels[i+2] = reduce(pixels[i+2]); 
} 

ctx.putImageData(pixels, 0, 0) 
+0

@pimvdb:似たような回答を投稿して申し訳ありません。私は投稿した後まで新しい回答があったという通知を受けなかった! – gthmb

+0

心配はいりません!あなたのことは実際にはもっときれいです。 – pimvdb

関連する問題