Javaプログラミング学習サイト ゆるゆるプログラミング

・Javaソースダウンロード(ColorConversion.java)

色の変換テーブルを使った画像の色変換を行うJavaのソースコードです。反転、輝度変更、量子化などのテーブルをモード指定で使用することができます。

このソースについての記事はこちら「テーブルによる色変換」です。

ColorConversion.javaをダウンロード

ダウンロードしたファイルはzip形式です。解凍して使ってください。Windowsの場合、ダウンロードしたzipファイルをマウスの右ボタンでクリックして表示されるポップアップメニューから「すべて展開(T)」で解凍できます。

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class ColorConversion {
	// modeによるカラーテーブルの設定
	static void setTable( int[] colorconv_r, int[] colorconv_g, int[] colorconv_b,
									 int mode )
	{
		int    i, col;
		double rad;

		switch ( mode ) {
			case 0:
				// 色反転
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = 255 - i;
					colorconv_g[ i ] = 255 - i;
					colorconv_b[ i ] = 255 - i;
				}
				break;

			case 1:
				// 輝度を半分
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = i / 2;
					colorconv_g[ i ] = i / 2;
					colorconv_b[ i ] = i / 2;
				}
				break;

			case 2:
				// 量子化
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = ( i / 64 ) * 64;
					colorconv_g[ i ] = ( i / 64 ) * 64;
					colorconv_b[ i ] = ( i / 64 ) * 64;
				}
				break;

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

			case 4:
				// 白っぽくする
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = i + 100;
					if ( 255 < colorconv_r[ i ] ) colorconv_r[ i ] = 255;
					colorconv_g[ i ] = i + 100;
					if ( 255 < colorconv_g[ i ] ) colorconv_g[ i ] = 255;
					colorconv_b[ i ] = i + 100;
					if ( 255 < colorconv_b[ i ] ) colorconv_b[ i ] = 255;
				}
				break;


			case 5:
				// 赤成分だけの残す
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = i;
					colorconv_g[ i ] = 0;
					colorconv_b[ i ] = 0;
				}
				break;


			case 6:
				// 緑成分だけの残す
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = 0;
					colorconv_g[ i ] = i;
					colorconv_b[ i ] = 0;
				}
				break;


			case 7:
				// 青成分だけの残す
				for ( i = 0; i < 256; ++ i ) {
					colorconv_r[ i ] = 0;
					colorconv_g[ i ] = 0;
					colorconv_b[ i ] = i;
				}
				break;

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


	public static void main( String[] args ) {
		// 結果格納フラグ
		boolean result;
		// 色変換モード
		int mode;
		// ファイル名
		String inname, outname;
		// 画像格納クラス
		BufferedImage img = null;

		// 入力した引数が3つ以上かを調べる
		if ( 3 > args.length ) {
			// 入力した引数が3つ未満の場合、使用方法を表示する
			System.out.println( "ColorConversion [入力JPG][出力JPG][モード]" );
			return;
		}

		// 入力JPEG名をinnameに代入(拡張子".jpg"省略なし)
		inname  = args[ 0 ];
		// 出力JPEG名をoutnameに代入(拡張子".jpg"省略なし)
		outname = args[ 1 ];

		// モードをmodeに代入
		try {
			// 引数を変換し、モードに代入
			mode = Integer.valueOf( args[ 2 ] );
		}
		catch( NumberFormatException ne )
		{
			System.out.println( "引数が不正です" );
			return;
		}

		// JPEGの読み込み
		try {
			// inname(入力JPEG)を読み込んでimgにセット
			img = ImageIO.read( new File( inname ) );
		} catch (Exception e) {
			// inname(入力JPEG)の読み込みに失敗したときの処理
			 e.printStackTrace();
			return;
		}


		// 画像の色の持ち方をチェック
		if ( BufferedImage.TYPE_3BYTE_BGR != img.getType() )
		{
			System.out.println( "対応していないカラーモデルです!("
									 + inname +")" );
			return;
		}

		// 色変換
		int x, y;
		int width, height;
		int color, r, g, b;
		int p;
		int newcolor;

		// 色変換テーブル
		int[] colorconv_r = new int[ 256 ];
		int[] colorconv_g = new int[ 256 ];
		int[] colorconv_b = new int[ 256 ];


		// 色変換テーブル設定
		setTable( colorconv_r, colorconv_g, colorconv_b, mode );

		// 画像サイズの取得
		width = img.getWidth();
		height= img.getHeight();

		for ( y = 0; y < height; ++ y ) {
			for ( x = 0; x < width; ++ x ) {
				// (x,y)の色を取得
				color = img.getRGB( x, y );

				// 色をr,g,bに分解
				r = ( color >> 16 ) & 0xff;
				g = ( color >> 8 ) & 0xff;
				b = color & 0xff;

				// r,g,bの色をテーブルで変換
				r = colorconv_r[ r ];
				g = colorconv_g[ g ];
				b = colorconv_b[ b ];

				// r,g,bの色を合成
				newcolor = ( r << 16 ) + ( g << 8 ) + b;

				// 合成した色を(x,y)に設定
				img.setRGB( x, y, newcolor );
			}
		}

		try {
			// imgをoutname(出力JPEG)に保存
			result = ImageIO.write( img, "jpeg", new File( outname ) );
		} catch ( Exception e ) {
			// outname(出力JPEG)の保存に失敗したときの処理
			e.printStackTrace();
			return;
		}

		// 正常に終了
		System.out.println( "正常に終了しました" );
	}
}

このソースについての記事はこちら「テーブルによる色変換」です。

 

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

 

 

 

 

Topへ