ゆるゆるプログラミング

・テーブルによる色変換 その2

ここでは、色変換テーブルを使った色変換のJavaソースコードのテーブル設定部分を上から順番に解説していきます。

001:    import java.awt.image.BufferedImage;
002:    import java.io.File;
003:    import javax.imageio.ImageIO;
004:    import java.io.IOException;

Javaのクラスライブラリの中から「java.awt.image.BufferedImage」と「java.io.File」と「javax.imageio.ImageIO」と「java.io.IOException」と「java.awt.image.RasterFormatException」というパッケージにあるクラスを、このプログラム内で使うために記述します。 この記述により、ImageIOクラスBufferedImageクラスRasterFormatExceptionが利用できるようになります。

006:    public class ColorConversion {

クラス名を、ColorConversionとしています。

007:    	// modeによるカラーテーブルの設定
008:    	static void setTable( int[] colorconv_r, int[] colorconv_g, int[] colorconv_b,

モード(mode)に対応した色変換テーブル(colorconv_r、colorconv_g、colorconv_b)を設定します。

015:    			case 0:
016:    				// 色反転
017:    				for ( i = 0; i < 256; ++ i ) {
018:    					colorconv_r[ i ] = 255 - i;
019:    					colorconv_g[ i ] = 255 - i;
020:    					colorconv_b[ i ] = 255 - i;
021:    				}
022:    				break;

mode=0の時、RGB(0~255)を255から引いた値をテーブルに格納しています。これで色が反転します。

024:    			case 1:
025:    				// 輝度を半分
026:    				for ( i = 0; i < 256; ++ i ) {
027:    					colorconv_r[ i ] = i / 2;
028:    					colorconv_g[ i ] = i / 2;
029:    					colorconv_b[ i ] = i / 2;
030:    				}
031:    				break;

mode=1の時、RGB(0~255)を2で割った値をテーブルに格納しています。これで画像の色が暗くなります。

033:    			case 2:
034:    				// 量子化
035:    				for ( i = 0; i < 256; ++ i ) {
036:    					colorconv_r[ i ] = ( i / 64 ) * 64;
037:    					colorconv_g[ i ] = ( i / 64 ) * 64;
038:    					colorconv_b[ i ] = ( i / 64 ) * 64;
039:    				}
040:    				break;

mode=2の時、RGB(0~255)を64で割った後、64を掛け直してテーブルに格納しています。RGBそれぞれのテーブルの値が、0/64/128/192の4種類だけになり、少ない色数で表現された画像になります。

042:    			case 3:
043:    				// サインカーブ
044:    				for ( i = 0; i < 256; ++ i ) {
045:    					rad = Math.toRadians( (double)i / 256.0 * 720.0 );
046:    					col = (int)( Math.sin( rad ) * 127.0 + 127.0 );
047:    					colorconv_r[ i ] = col;
048:    					colorconv_g[ i ] = col;
049:    					colorconv_b[ i ] = col;
050:    				}
051:    				break;

mode=3の時、RGB(0~255)を256.0で割った後、720.0を掛けることで、0~255の値を0.0~720.0°の範囲の角度に変換します。その角度のsinに127.0を掛けて127.0を足すことで0~254を求め、それをテーブルに格納しています。

053:    			case 4:
054:    				// 白っぽくする
055:    				for ( i = 0; i < 256; ++ i ) {
056:    					colorconv_r[ i ] = i + 100;
057:    					if ( 255 < colorconv_r[ i ] ) colorconv_r[ i ] = 255;
058:    					colorconv_g[ i ] = i + 100;
059:    					if ( 255 < colorconv_g[ i ] ) colorconv_g[ i ] = 255;
060:    					colorconv_b[ i ] = i + 100;
061:    					if ( 255 < colorconv_b[ i ] ) colorconv_b[ i ] = 255;
062:    				}
063:    				break;

mode=4の時、RGB(0~255)に100を足し、その値をテーブルに格納しています。値が255を超えた場合に255を格納します。

066:    			case 5:
067:    				// 赤成分だけの残す
068:    				for ( i = 0; i < 256; ++ i ) {
069:    					colorconv_r[ i ] = i;
070:    					colorconv_g[ i ] = 0;
071:    					colorconv_b[ i ] = 0;
072:    				}
073:    				break;

mode=5の時、R(0~255)の値を、Rの変換テーブルにそのまま格納します。GとBのテーブルには0を格納します。

076:    			case 6:
077:    				// 緑成分だけの残す
078:    				for ( i = 0; i < 256; ++ i ) {
079:    					colorconv_r[ i ] = 0;
080:    					colorconv_g[ i ] = i;
081:    					colorconv_b[ i ] = 0;
082:    				}
083:    				break;

mode=6の時、G(0~255)の値を、Gの変換テーブルにそのまま格納します。RとBのテーブルには0を格納します。

086:    			case 7:
087:    				// 青成分だけの残す
088:    				for ( i = 0; i < 256; ++ i ) {
089:    					colorconv_r[ i ] = 0;
090:    					colorconv_g[ i ] = 0;
091:    					colorconv_b[ i ] = i;
092:    				}
093:    				break;

mode=7の時、B(0~255)の値を、Bの変換テーブルにそのまま格納します。RとGのテーブルには0を格納します。

095:    			default:
096:    				// 入力値と出力値を同じにする
097:    				for ( i = 0; i < 256; ++ i ) {
098:    					colorconv_r[ i ] = i;
099:    					colorconv_g[ i ] = i;
100:    					colorconv_b[ i ] = i;
101:    				}
102:    				break;

modeが0~7以外の時、RGB(0~255)の値を、変換せずにテーブルに格納します。入力画像と出力画像が同じになります。

■関連コンテンツ

テーブルによる色変換 テーブルによる色の変換方法を解説
テーブルによる色変換 その3 テーブルによる色の変換方法を解説(その3)
三角関数 sin sinの意味と、Math.sinの使い方について解説
switch文 式による処理の分岐に使用するswitch文について解説
配列 同じ型の変数をまとめた配列について解説
光と色の3原色 光と色の3原色の考え方を解説

■新着情報

2017.11.17 N値化 カラー画像をN値化する方法について解説
2017.11.16 最も近い値の取得 指定値に最も近い配列の値を取得する方法を解説
2017.10.02 アルファ値(透過) アルファ値(透過)について

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

Topへ