8

だから、これは私が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 用の方法を使用して生成されたものです。

左: php/ImageMagick のビネット。 右: 上記の方法を使用した Android のビネット

4

2 に答える 2

4

左側の画像を注意深く見ると、tfは、非常に線形である右側の画像に対して、アルファ(透明度)の指数関数的増加を使用しています。

明らかShader.TitleMode.CLAMPに線形関数です。代わりに、RadialGradient(float x、float y、float radius、int [] Colors、float [] position、Shader.TileMode tile)を使用して、指数関数的に減少するカラー値(黒からトランスペアレント)。

または、ICSギャラリーのギャラリー3Dソースを参照することもできますhttp://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/gallery3d /photoeditor/filters/VignetteFilter.java?av=h

于 2012-05-22T06:59:18.230 に答える
1

これは古い議論であることは知っていますが、誰かを助けるかもしれません。AccelerateInterpolatorを使用して、Taranfx が言及したポイントを生成することができ、それは素晴らしいものをロックします。

于 2013-08-11T11:09:53.237 に答える