2020.03.23

色をARGB値に分解

はじめに

画像で使用されている色のうち24ビットフルカラー)、32ビットカラーからR(赤)、G(緑)、B(青)、A(アルファ値)を抽出する方法を説明します。

色の分解方法

JavaのBufferedImageクラスに読み込んだ画像色情報は、getRGBメソッドで取得することができます。任意の画像座標(x,y)を引数として与えると色情報が取得できます。

BufferedImage.getRGBメソッド

public static int getRGB( int x, int y )
・(x,y)で指定した画像座標の色情報を取得します。

  パラメータ x : 画像のx座標(単位ピクセル)
        y : 画像のy座標(単位ピクセル)

   戻り値      (x,y)の色情報

getRGBメソッド戻り値は、int型(32bit)の整数で、以下の仕様で色の値が格納されています。

1画素の色表現

画素アルファ値(8bit)+赤成分(8bit)+緑成分(8bit)+青成分(8bit)=32bit

のように並べて表現しています。

この値からARGBへの分解には、ビット操作の右シフトとAND演算を使います。

ビットシフト演算子は、">>"で、指定した回数分ビットを右にずらす操作のことです。1回の右シフトは2で割ることと同じです。

AND演算は、ビットごとに演算する操作の1つで、両方のビットが1の場合だけ1となり、その他は0になります。

ARGBの抽出は、以下のソースコードを参考にしてください。

	// (x,y)の色をcolorに代入
	int color = img.getRGB( x, y );
	
	// colorをargbに分解
	int a = color >> 24;
	int r = ( color >> 16 ) & 0xff;
	int g = ( color >> 8 ) & 0xff;
	int b = color & 0xff;

それでは、上記のソースコードがどのように動いているかを例で確認していきましょう。

getRGBメソッドで取得したint型変数colorの値を以下とします。

color = 11111110100000000000111100110100ビット表現)

	int a = color >> 24;

( color >> 24 )の値は、00000000000000000000000011111110

元のcolorのビットが右に24回シフトされています。

この演算により右から8ビットだけの値が残るので、0~255の範囲の値になります。

これがa(アルファ)の値です。

	int r = ( color >> 16 ) & 0xff;

( color >> 16 )の値は、00000000000000001111111010000000

元のcolorのビットが右に16回シフトされています。

0xffをビットで表すと、 00000000000000000000000011111111

AND演算をした結果は、00000000000000000000000010000000

この演算により右から8ビットだけの値が残るので、0~255の範囲の値になります。

これがr(赤)の値です。

	int g = ( color >> 8 ) & 0xff;

( color >> 8 )の値は、 00000000111111101000000000001111

元のcolorのビットが右に8回シフトされています。

0xffをビットで表すと、 00000000000000000000000011111111

AND演算をした結果は、00000000000000000000000000001111

この演算により右から8ビットだけの値が残るので、0~255の範囲の値になります。

これがg(緑)の値です。

以上が、int型色情報からARGBを抽出する方法です。

24ビットカラーの場合でも色情報は32ビットで取得しますが、アルファ値(透過)を計算する必要はありません。必要であれば"11111111"(透過なし)にするのが無難です。

以上です。

関連コンテンツ

ビットマップ画像を構成する画素に赤(R)、緑(G)、青(B)の他に透過(A)を指定することができます。詳しくは、こちら。

2017.10.02

数値を2進数で表したときの各桁の「0」と「1」に対して演算を行えます。4種類の演算、AND(論理積)、OR(論理和)、XOR(排他的論理和)、NOT(否定)を詳しく説明しています。

2016.03.26

2進数の桁を左右のどちらかに指定回数だけずらすビットシフトについて詳しく解説しています。

2016.04.03

一般に使われている画像の色の種類ってどんなものがありますか?。色の種類ごとの用途も説明しています。

2015.12.22

フルカラー画像の色数を減らす処理の1つのメディアンカットのJavaのソースプログラムを紹介しています

2017.3.4

フルカラー(16,777,216通りの色)から選択した複数の色に、色番号を割り当てたテーブルをカラーマップといいます。

2022.08.25

PCやスマートフォンのディスプレイに表示されている色、プリンターで印刷される色の仕組みについて解説しています。

2020.03.23

デジタル画像データを構成している要素について解説しています。

2015.12.22

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

画像って何?

2022.07.25

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

画像の座標系はどのように定義されていますか?

2020.03.23

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

プログラミングで使う変数って何?

2020.03.23

自然数と整数って何が違う?

2020.03.23

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

2値化は、画像処理の1つの方法で、カラー画像を2つ色だけで表現する画像に変換することです。この画像処理をJavaで作ってみませんか?

2016.01.21

2値化は、画像処理の1つの方法で、カラー画像を2つ色だけで表現する画像に変換することです。この記事では、2値の画像メモリを使って変換しています。

2020.10.13

フルカラー(24bit)画像を縦横のサイズを2倍の画像に変換するソースコードを解説します。

2020.03.23

カラーの画像を白・灰色・黒だけで表現した画像に変換する方法を解説しています。Javaのソースコード付きです。

2020.03.23

NTSC 加重平均法を使ったグレースケール変換を紹介しています。Javaのソースコードを使って詳しく解説しています。

2016.01.26

画像全体の画素の色RGBの平均値を計算する方法をソースコードを使って解説しています。

2023.05.04

フルカラー(24bit)画像を色反転(ネガティブ)画像に変換するソースコードを解説しています。Javaのソースコード付きです。

2020.03.23

広告