ディザリング(ベイヤー・渦巻・網点)
基本的には二値化処理ですが、こちらは乱数を使わずに一定のパターンに応じて処理を行います。
private Bitmap effectPatternDither( Bitmap bitmap, int patternFlg ){ 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 ); int i, j; int[][] pattern; int[][] pattern1 = { { 0, 8, 2, 10 }, { 12, 4, 14, 6 }, { 3, 11, 1, 9 }, { 15, 7, 13, 5 } }; int[][] pattern2 = { { 6, 7, 8, 9 }, { 5, 0, 1, 10 }, { 4, 3, 2, 11 }, { 15, 14, 13, 12 } }; int[][] pattern3 = { { 11, 4, 6, 9 }, { 12, 0, 2, 14 }, { 7, 8, 10, 5 }, { 3, 15, 13, 1 } }; if( patternFlg == 2 ){ pattern = pattern2; } else if( patternFlg == 3 ){ pattern = pattern3; } else { pattern = pattern1; } for( i = 0; i < width; ++i ){ for( j = 0; j < height; ++j ){ int bitmapColor = pixels[( i + j * width )]; int r = Color.red( bitmapColor ); int g = Color.green( bitmapColor ); int b = Color.blue( bitmapColor ); r = r / 16; g = g / 16; b = b / 16; int x, y, z; y = ( r + g + b ) / 3; z = pattern[i % 4][j % 4]; if( y < z ){ x = 0; } else { x = 255; } int rr, gg, bb; rr = gg = bb = x; pixels[( i + j * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; }
オリジナル:
二値化(白と黒):
ディザリング(ランダム)(違いは詳細で見てください):
ディザリング(ベイヤー)(違いは詳細で見てください):
ディザリング(渦巻)(違いは詳細で見てください):
ディザリング(網点)(違いは詳細で見てください):