ブレンドモード
まとめて公開。。。これでネタ切れ。_| ̄|○
// ブレンドモード(加算) private Bitmap effectBlendAdd( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); rr = rr + mergeR; gg = gg + mergeG; bb = bb + mergeB; if( rr > 255 ){ rr = 255; } if( gg > 255 ){ gg = 255; } if( bb > 255 ){ bb = 255; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(乗算) private Bitmap effectBlendMultiple( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); rr = ( rr * mergeR ) / 255; gg = ( gg * mergeG ) / 255; bb = ( bb * mergeB ) / 255; pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(減算) private Bitmap effectBlendDifference( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); rr = rr - mergeR; gg = gg - mergeG; bb = bb - mergeB; if( rr < 0 ){ rr = 0; } if( gg < 0 ){ gg = 0; } if( bb < 0 ){ bb = 0; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(スクリーン) private Bitmap effectBlendScreen( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); rr = 255 - ( ( 255 - rr ) * ( 255 - mergeR ) ) / 255; gg = 255 - ( ( 255 - gg ) * ( 255 - mergeG ) ) / 255; bb = 255 - ( ( 255 - bb ) * ( 255 - mergeB ) ) / 255; pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(オーバーレイ) private Bitmap effectBlendOverlay( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); if( rr < 128 ){ rr = rr * mergeR * 2 / 255; } else { rr = 2 * ( rr + mergeR - rr * mergeR / 255 ) - 255; } if( gg < 128 ){ gg = gg * mergeG * 2 / 255; } else { gg = 2 * ( gg + mergeG - gg * mergeG / 255 ) - 255; } if( bb < 128 ){ bb = bb * mergeB * 2 / 255; } else { bb = 2 * ( bb + mergeB - bb * mergeB / 255 ) - 255; } if( rr > 255 ){ rr = 255; } if( gg > 255 ){ gg = 255; } if( bb > 255 ){ bb = 255; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(覆い焼き) private Bitmap effectBlendDodge( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); if( mergeR == 255 ){ rr = 255; } else { rr = rr * 255 / ( 255 - mergeR ); } if( mergeG == 255 ){ gg = 255; } else { gg = gg * 255 / ( 255 - mergeG ); } if( mergeB == 255 ){ bb = 255; } else { bb = bb * 255 / ( 255 - mergeB ); } if( rr > 255 ){ rr = 255; } if( gg > 255 ){ gg = 255; } if( bb > 255 ){ bb = 255; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(焼き込み) private Bitmap effectBlendBurn( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); if( mergeR == 0 ){ rr = 0; } else { rr = 255 - ( ( 255 - rr ) * 255 / mergeR ); } if( mergeG == 0 ){ gg = 0; } else { gg = 255 - ( ( 255 - gg ) * 255 / mergeG ); } if( mergeB == 0 ){ bb = 0; } else { bb = 255 - ( ( 255 - bb ) * 255 / mergeB ); } if( rr < 0 ){ rr = 0; } if( gg < 0 ){ gg = 0; } if( bb < 0 ){ bb = 0; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(比較・暗) private Bitmap effectBlendDarken( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); if( rr > mergeR ){ rr = mergeR; } if( gg > mergeG ){ gg = mergeG; } if( bb > mergeB ){ bb = mergeB; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(比較・明) private Bitmap effectBlendLighten( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); if( rr < mergeR ){ rr = mergeR; } if( gg < mergeG ){ gg = mergeG; } if( bb < mergeB ){ bb = mergeB; } pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; } // ブレンドモード(除外) private Bitmap effectBlendExclusion( 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 ); int mergeR = 250, mergeG = 153, mergeB = 10; 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 ); rr = rr + mergeR - 2 * rr * mergeR / 255; gg = gg + mergeG - 2 * gg * mergeG / 255; bb = bb + mergeB - 2 * bb * mergeB / 255; pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixels, 0, width, 0, 0, width, height ); return bitmap; }
オリジナル:
ブレンドモード(加算)(違いは詳細で見てください):
ブレンドモード(乗算)(違いは詳細で見てください):
ブレンドモード(減算)(違いは詳細で見てください):
ブレンドモード(スクリーン)(違いは詳細で見てください):
ブレンドモード(オーバーレイ)(違いは詳細で見てください):
ブレンドモード(覆い焼き)(違いは詳細で見てください):
ブレンドモード(焼き込み)(違いは詳細で見てください):
ブレンドモード(比較・暗)(違いは詳細で見てください):
ブレンドモード(比較・明)(違いは詳細で見てください):
ブレンドモード(除外)(違いは詳細で見てください):
本来であれば二枚の画像を使って処理するのですが、面倒だったので二枚目の画像(RGB値)は固定にしています。手抜きでスミマセン。。。_| ̄|○
新しいネタが蓄積されてきたら再び公開するかもしれません。。。