だから、これは私がAndroidのビネットスタイル効果のために持っているものです(画像はビットマップです):
public void vignette() {
float radius = (float) (image.getWidth()/1.5);
RadialGradient gradient = new RadialGradient(image.getWidth()/2, image.getHeight()/2, radius, Color.TRANSPARENT, Color.BLACK, Shader.TileMode.CLAMP);
Canvas canvas = new Canvas(image);
canvas.drawARGB(1, 0, 0, 0);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setShader(gradient);
final Rect rect = new Rect(0, 0, image.getWidth(), image.getHeight());
final RectF rectf = new RectF(rect);
canvas.drawRect(rectf, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(image, rect, rect, paint);
}
これは「機能」しますが、いくつかの問題があります。まず第一に、これは実際にはビネットではありません。これは単なるグラデーションであるため、黒のビットが端に近づくのではなく、ほぼ中央に向かっていることがわかります。
使用される RadialGradient では、楕円ではなく円の半径のみを設定できます。楕円は、円よりも非正方形の画像の寸法に効果的に一致させることができます。
グラデーションの品質も優れていません。
ImageMagick から vignetteImage メソッドを複製しようとしています (特に php バージョンを参照しています)。必要な画像のスタイルを生成する PHP のコードがあります。
$im = new IMagick('city.png');
$im->vignetteImage($width/1.5, 350, 20, 20);
NDK を使用して ImageMagick を構築しようとしましたが、さまざまな画像ライブラリを適切にリンクすることに失敗しました (gif サポートのみで構築に成功しましたが、png、jpeg、または tiff は構築しませんでした)。
上記の2つの方法を比較した画像も添付しました。左側の画像は php を介して ImageMagick で生成されたもので、右側の画像は上記の Android 用の方法を使用して生成されたものです。