ディザリング(ランダム)
基本的には二値化処理ですが、乱数を使って条件分岐の数値を変化させています。
private Bitmap effectRandomDither( Bitmap bitmap ){ if( bitmap == null ){ bitmap = BitmapFactory.decodeResource( getResources( ), R.drawable.original ).copy( Bitmap.Config.ARGB_8888, true ); } if( bitmap == null ){ return bitmap; } if( bitmap.isMutable( ) != true ){ bitmap = bitmap.copy( Bitmap.Config.ARGB_8888, true ); } int height = bitmap.getHeight( ); int width = bitmap.getWidth( ); int[] pixels = new int[( width * height )]; bitmap.getPixels( pixels, 0, width, 0, 0, width, height ); Random random = new Random( ); for( int YY = 0; YY < width; ++YY ){ for( int XX = 0; XX < height; ++XX ){ int bitmapColor = pixels[( YY + XX * width )]; int rr = Color.red( bitmapColor ); int gg = Color.green( bitmapColor ); int bb = Color.blue( bitmapColor ); int Y = ( rr + gg + bb ) / 3; if( Y < random.nextInt( 256 ) ){ Y = 0; } else { Y = 255; } rr = Y; gg = Y; bb = Y; pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; }
オリジナル:
二値化(白と黒):
ディザリング(ランダム)(違いは詳細で見てください):
疑似階調表現の一つしてディザリングがあるらしいのですが、この方法では処理結果が一定しなかったり条件によっては見づらくなる事もあるようです。
その欠点を改善した誤差拡散法というものがあるようですが、まだまだ勉強中。。。_| ̄|○