こんばんは。きわさです。
今回は、Javascriptで画像の指定した色を透過させる方法です。
function test(r, g, b) { var canvas = document.getElementsByTagName("canvas")[0]; var context = canvas.getContext("2d"); var imageData = context.getImageData(0, 0, canvas.width, canvas.height); for(var i = 0; i < (imageData.width*imageData.height); i++) { if((imageData.data[i*4] == r) && (imageData.data[i*4+1] == g) && (imageData.data[i*4+2] == b)) { imageData.data[i*4+3] = 0; } } context.putImageData(imageData, 0, 0); return; }
この関数 test で何をしているかと言うと、
まず引数のr, g, bはRGBによる色指定で、例えば黄色の場合はr=255, g=255, b=0といった感じです。
次にimageDataです。getImageData(x, y, w, h)はx, yの位置から幅w、高さhの画像データを取得します。
すると、imageData.width, imageData.heightにはそれぞれw, hが格納され、imageData.dataにはw*h*4の配列が格納されます。
4というのはrgbaのことです。300 x 300の画像の場合は、imageData.data.lengthは300*300*4=360000となり、データは
imageData.data[0] : 画像(0, 0)位置のrの値
imageData.data[1] : 画像(0, 0)位置のgの値
imageData.data[2] : 画像(0, 0)位置のbの値
imageData.data[3] : 画像(0, 0)位置のaの値
imageData.data[4] : 画像(1, 0)位置のrの値
…
といった感じになります。
aは透明度で0(透明)~255(不透明)です。
あとは幅x高さの分だけループさせ、dataの[i*4], [i*4+1], [i*4+2]がそれぞれr, g, bと一致する場合は指定色と判断し、[i*4+3]の透明度に0(透明)を設定しています。
最後にputImageData(imageData, x, y)でimageDataをx, yの位置に出力しています。
サンプルを置いておきます。
RGB値をテキストボックスに直接入力するか、画像をクリックして自動入力し、
透過ボタンを押すと、指定した色の箇所を透過させます。canvasの背景は黒にしています。
完了ボタンを押すと右クリックで保存可能な透過PNGに変換します。
G: ±
B: ±
画像編集ソフト等を使わずにJavascriptのみで透過画像が作れると色々便利ですね。