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

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

画像の幅ピクセルと高さピクセルと、ノイズの割合をパーセント(%)で指定して正確な割合のノイズ画像を作成するJavaソースコードです。作成する画像形式はPNGです。

このソースについての記事はこちら「正確な割合のノイズ画像」です。

Noise3.javaをダウンロード

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

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

public class Noise3 {
	public static void main( String[] args ) {
		// 変数宣言
		int w, h;		// 画像の幅・高さ
		double noiserate;	// ノイズの割合
		String outname;	// 出力ファイル名
		BufferedImage img = null;	// 画像格納クラス

		// 入力した引数が4以上かを調べる
		if ( 4 > args.length ) {
			// 入力した引数が4未満の場合、使用方法を表示する
			System.out.println( 
				"Noise3 [出力PNG名][幅][高][ノイズの割合%]" );
			return;
		}

		try {
			// 引数を変換し、画像サイズに代入
			w  =  Integer.valueOf( args[ 1 ] );
			h  =  Integer.valueOf( args[ 2 ] );
			// 引数を変換し、ノイズの割合に代入
			noiserate = Double.valueOf( args[ 3 ] );
		}
		catch( NumberFormatException ne )
		{
			System.out.println( "引数が不正です" );
			return;
		}

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

		// 新しい画像を作成
		// 24ビットカラーの画像を作成
		try {
			img = new BufferedImage( w, h,
						 BufferedImage.TYPE_INT_RGB );
		} catch ( Exception e ) {
			// 画像作成に失敗したときの処理
			e.printStackTrace();
			return;
		}

		// ノイズ画像の作成
		int x, y, noisecount;
		int sx, sy;
		int r, g, b, color;
		int color1, color2;

		// ノイズ数を正確に計算
		noisecount = (int)( (double)( h * w ) * noiserate / 100.0 );

		// ノイズ画像の元になる画像を作成
		for ( y = 0; y < h; ++ y ) {
			for ( x = 0; x < w; ++ x ) {
				// ノイズ色を決定
				if ( 1 <= noisecount ) {
					// ノイズとして黒色を設定
					r = 0;
					g = 0;
					b = 0;
					-- noisecount;
				}
				else {
					// ノイズでない白色を設定
					r = 255;
					g = 255;
					b = 255;
				}

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

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

		// 全ピクセルをランダムに並び替え
		for ( y = 0; y < h; ++ y ) {
			for ( x = 0; x < w; ++ x ) {
				// sxに0~w-1の乱数を格納
				sx = (int)( Math.random() * (double)w ); 

				// syに0~h-1の乱数を格納
				sy = (int)( Math.random() * (double)h ); 

				// (x,y)と(sx,sy)の色を入れ替える
				color1 = img.getRGB( x, y );
				color2 = img.getRGB( sx, sy );
				img.setRGB( x, y, color2 );
				img.setRGB( sx, sy, color1 );
			}
		}


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

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

このソースについての記事はこちら「正確な割合のノイズ画像」です。

 

■新着情報

2021.06.23 配列の初期値 配列の生成直後の値は?
2021.06.18 変数の初期値 変数に値を代入しないで計算

■広告

 

 

 

 

Topへ