皆さまこんにちは。
このまえPS2を買いました、yu3xx(ゆーさんちょめちょめ)です。
以前のおさらい
まえに投稿した「二次元画像のピクセル値を取得する方法」の記事では、「getPixel(x,y)」を使って「画像のピクセル値を取得する方法」について解説しました。
この超入門#8の記事は、「8bitグレースケール画像」を対象にした内容でした。
残念なことに、「RGBカラー画像」に対して「getPixel」を使ってしまうと、ヘンテコな値が出てきます。
これは「RGBカラー画像」においては、1つのピクセルの中に「赤256階調、緑256階調、青256階調の、3種類の情報」が突っ込まれているからです。
そこで今回は、「カラー画像のRGBピクセル値をそれぞれ取得する方法」について解説します。
もくじ
結論
めんどいので、まず結論だけ言っちゃいます。
カラー画像のピクセル値を、赤緑青のRGBでそれぞれ数値化したい場合には、以下の自作関数を「getPixel(x,y)」の代わりに使います。
※ 座標(下記の例では0,0)は、自分で好きな座標を打ち込んでください。
var red,green,blue;
getPixelRGB(0,0);
print(red,green,blue);
//-----------------------------------------------------------------------------
function getPixelRGB(x,y){
v = getPixel(x,y);
red = (v>>16)&0xff; // right shift 16 bits, and extract lower 8 bits
green = (v>>8)&0xff; // right shift 8 bits, and extract lower 8 bits
blue = v&0xff; // extract lower 8 bits
}
//-----------------------------------------------------------------------------
返したい値が3つあるので、グローバルな変数red, green, blueを用意してから、その中に値を格納します。それぞれ「148, 150, 149」が格納されました。
これで終了です。
適当な説明
・getPixelは、1つの値しか返せない。
・RGB値 = 148, 150, 149 のピクセルにgetPixelすると、「-7039339」なる値が吐き出される。
・7039339(10進数)は、0110 1011 0110 1001 0110 1011(2進数)。
・これに2の補数(ビット反転して+1)することで、-7039339(10進数)は、1001 0100 1001 0110 1001 0101(2進数)。
・この24bitのうち、頭側8bitがred、まんなか8bitがgreen、お尻側8bitがblue。
・このナマの値にbit演算することでRGBを取り出すことができる。
・「>>」は右シフト。「v>>16」は、vを2進数表現したものを「右に16bitシフト」させる。
・「&」はAND。
・「0x」はプログラミング界の約束事で「16進数だよ、これ」の表現。
・16進数の「ff」は、2進数では「1111 1111」。
・「1111 1111」のANDは、「下位の8bit分を取り出す命令」に同じ。
・RGBそれぞれのピクセル値をふまえて、1つの値(8bitグレースケール変換した値)を取り出したいなら、(red+green+blue)/3するといい。これはunweighted。
・0.299*red + 0.587*green + 0.114*blueすれば、weighted。
・RGB画像は32bit。色表現に必要なbitは8*3=24bit。残り8bitは仕事してたり、してなかったり。32はコンピュータの好み。
・RGB画像にbitDepth()すると24。でも実際には1pixelあたり32bitらしい(show info)。たぶん先頭8bitは1埋め。
まとめ
おしまい
・公開したマクロのまとめ