0

アプリのビネット効果を作成しようとしています。これを達成するための助けを求めて多くのことを探してきましたが、何も見つかりませんでした。

最近、 このチュートリアルを見つけました。

そして、このコードを使用してアプリに実装しようとしました:

public int[] drawBitmap(Bitmap originalBitmap){
    Bitmap mask;
    Paint paint = new Paint();
    mask = convertToAlphaMask(BitmapFactory.decodeResource(context.getResources(), R.drawable.spot_mask));
    Shader shader = createShader(mask);
    paint.setShader(shader);

    Bitmap tempBit = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(tempBit);
    canvas.drawBitmap(originalBitmap, 0, 0,paint);
    tempBit.getPixels(pixels, 0, tempBit.getWidth(), 0, 0, tempBit.getWidth(), tempBit.getHeight());
    return pixels;
}
private static Bitmap convertToAlphaMask(Bitmap input) {
    Bitmap a = Bitmap.createBitmap(input.getWidth(), input.getHeight(), Bitmap.Config.ALPHA_8);
    Canvas c = new Canvas(a);
    c.drawBitmap(input, 0.0f, 0.0f, null);
    return a;
}
private static Shader createShader(Bitmap b) {
    return new BitmapShader(b, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
}

しかし、これの効果は次のようになります:(唯一の変更は画像の上部にあります) http://postimg.org/image/rrivq28v1/

私は何を間違えましたか?

また、ビットマップにビネット効果を適用する他の方法はありますか?

ありがとう!

4

2 に答える 2

3

リンクを介して自分のソリューションを指摘したため、最初の回答が削除されました。だから私はここであなたの質問に答えます。トリックは、4 つの線形グラデーションを使用することです。それらを適用すると、真のビネット効果にかなり近い結果が得られます。そして、それも非常に高速です;)これが私の解決策の一部です。まず、キャンバスを作成する必要があります。

    Canvas canvas = new Canvas(bitmapOut);
    canvas.drawBitmap(mVignette.getBitmapIn(), 0, 0, null);

次に、効果が画像に到達する範囲を定義します。

    int tenthLeftRight = (int)(width/5);
    int tenthTopBottom = (int)(height/5);

次に、4 つのシェーダーを作成します。

    // Gradient left - right
    Shader linGradLR = new LinearGradient(0, height/2, tenthLeftRight/2, height/2, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP);
    // Gradient top - bottom
    Shader linGradTB = new LinearGradient(width/2, 0, width/2, tenthTopBottom, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP);
    // Gradient right - left
    Shader linGradRL = new LinearGradient(width, height/2, (width-tenthLeftRight), height/2, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP);
    // Gradient bottom - top
    Shader linGradBT = new LinearGradient(width/2, height, width/2, (height - tenthTopBottom), Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP); 

あとは、キャンバスに描画するだけです。

    Paint paint = new Paint();
    paint.setShader(linGradLR);
    paint.setAntiAlias(true);
    paint.setDither(true);
    paint.setAlpha(125);
    // Rect for Grad left - right
    Rect rect = new Rect(0, 0, tenthLeftRight, height);
    RectF rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

    // Rect for Grad top - bottom
    paint.setShader(linGradTB);
    rect = new Rect(0, 0, width, tenthTopBottom);
    rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

    // Rect for Grad right - left
    paint.setShader(linGradRL);
    rect = new Rect(width, 0, width - tenthLeftRight, height);
    rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

    // Rect for Grad bottom - top
    paint.setShader(linGradBT);
    rect = new Rect(0, height - tenthTopBottom, width, height);
    rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);
于 2013-11-23T13:41:48.640 に答える