ゆるゆるプログラミング

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

このソースについての記事はこちら「N値化」です。

NColor.javaをダウンロード
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class NColor {
	// 最も近い値を格納した配列の添え字を求める
	public static int getNearestValue( int[] list, int v )
	{
		// 変数の宣言
		int i;		// ループ用
		int num;	// 配列の添え字
		int minv;	// 配列値-指定値vの絶対値

		// 配列の個数が1未満の処理
		if ( 1 >list.length ) return -1;

		// 指定値と全ての配列値の差を比較
		num = 0;
		minv = Math.abs( list[ 0 ] - v );
		for ( i = 1; i < list.length; ++ i ) {
			if ( Math.abs( list[ i ] - v ) < minv ) {
				num = i;
				minv = Math.abs( list[ i ] - v );
			}
		}

		return num;
	}


	// メイン
	public static void main( String[] args ) {
		// 結果格納フラグ
		boolean result;
		// ファイル名
		String inname, outname;
		// 画像格納クラス
		BufferedImage img = null;
		// 色リスト
		int[] colorlist;
		// 256色→N色変換テーブル
		int[] converttbl;

		// 入力した引数が4つ以上かを調べる
		if ( 4 > args.length ) {
			// 入力した引数が2つ未満の場合、使用方法を表示する
			System.out.println( "NColor [入力JPEG名] [出力PNG名] [値1] [値2] .." );
			return;
		}

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

		// 色リストの作成
		colorlist = new int[ args.length - 2 ];
		for ( int i = 2; i < args.length; ++ i ) {
			// 値をcolorlistに代入
			try {
				// 文字列をintに変換して値を代入
				colorlist[ i - 2 ] = Integer.valueOf( args[ i ] );
			}
			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;
		}

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

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

		// 256色→N色変換テーブル作成
		converttbl = new int[ 256 ];
		for ( int i = 0; i < 256; ++ i ) {
			// iに一番近い値を取得
			int num = getNearestValue( colorlist, i );
			if ( 0 <= num ) {
				// 配列の添え字numから色を取得
				p = colorlist[ num ];
				// pを0~255の範囲に変換
				if ( 0 > p )
					p = 0;
				else {
					if ( 255 < p ) p = 255;
				}
				converttbl[ i ] = p;
			}
		}

		// N色変換
		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;

				// rgbに重みを付けてpを計算
				p = (int)( 0.29891 * (double)r
					 + 0.58661 * (double)g
						 + 0.11448 * (double)b );

				// 256色→N色変換テーブルから変換色を取得
				p = converttbl[ p ];

				// r,g,bにpを代入
				r = p;
				g = p;
				b = p;

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

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

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

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

 

■新着情報

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

■広告

法人向けのETC専用カード

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

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

 

 

 

 

Topへ