Как изменить непрозрачность растрового изображения? - PullRequest
31 голосов
/ 25 февраля 2011

У меня есть растровое изображение:

Bitmap bitmap = BitmapFactory.decodeFile("some/arbitrary/path/image.jpg");

Но я не собираюсь отображать изображение пользователю.Я хочу, чтобы альфа была 100 (из 255).Если это невозможно, могу ли я установить непрозрачность Bitmap?

Ответы [ 6 ]

75 голосов
/ 25 февраля 2011

Насколько я знаю, непрозрачность или другие цветовые фильтры не могут быть установлены на самом растровом изображении.Вам нужно установить альфа, когда вы используете изображение:

Если вы используете ImageView, есть ImageView.setAlpha () .

Если выиспользуя Canvas, вам нужно использовать Paint.setAlpha () :

Paint paint = new Paint();
paint.setAlpha(100);
canvas.drawBitmap(bitmap, src, dst, paint);

Также, включив ответ WarrenFaith, если вы будете использовать Bitmap там, где требуется рисование, вы можетеиспользуйте BitmapDrawable.setAlpha () .

28 голосов
/ 25 февраля 2011

Вы также можете попробовать BitmapDrawable вместо Bitmap. Если это полезно для вас, зависит от того, как вы используете растровое изображение ...

Редактировать

Как комментатор спросил, как он может хранить растровое изображение с альфа-кодом, вот код:

// lets create a new empty bitmap
Bitmap newBitmap = Bitmap.createBitmap(originalBitmap.getWidth(), originalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
// create a canvas where we can draw on
Canvas canvas = new Canvas(newBitmap);
// create a paint instance with alpha
Paint alphaPaint = new Paint();
alphaPaint.setAlpha(42);
// now lets draw using alphaPaint instance
canvas.drawBitmap(originalBitmap, 0, 0, alphaPaint);

// now lets store the bitmap to a file - the canvas has drawn on the newBitmap, so we can just store that one
// please add stream handling with try/catch blocks
FileOutputStream fos = new FileOutputStream(new File("/awesome/path/to/bitmap.png"));
newBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
19 голосов
/ 24 февраля 2014
public Bitmap makeTransparent(Bitmap src, int value) {  
    int width = src.getWidth();
    int height = src.getHeight();
       Bitmap transBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
       Canvas canvas = new Canvas(transBitmap);
       canvas.drawARGB(0, 0, 0, 0);
        // config paint
        final Paint paint = new Paint();
        paint.setAlpha(value);
        canvas.drawBitmap(src, 0, 0, paint);    
        return transBitmap;
}
17 голосов
/ 14 сентября 2011
Bitmap bgr = BitmapFactory.decodeResource(getResources(),R.drawable.main_logo_2);       
Paint transparentpainthack = new Paint();
transparentpainthack.setAlpha(100);
canvas.drawBitmap(bgr, 0, 0, transparentpainthack);
2 голосов
/ 07 февраля 2016

https://dzone.com/articles/adjusting-opacity-android предлагает:

/**
 * @param bitmap The source bitmap.
 * @param opacity a value between 0 (completely transparent) and 255 (completely
 * opaque).
 * @return The opacity-adjusted bitmap.  If the source bitmap is mutable it will be
 * adjusted and returned, otherwise a new bitmap is created.
 */
private Bitmap adjustOpacity(Bitmap bitmap, int opacity)
{
    Bitmap mutableBitmap = bitmap.isMutable()
                       ? bitmap
                       : bitmap.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(mutableBitmap);
    int colour = (opacity & 0xFF) << 24;
    canvas.drawColor(colour, PorterDuff.Mode.DST_IN);
    return mutableBitmap;
}

Обратите внимание, что с DST_IN вы можете изменять (а не сбрасывать) прозрачность уже прозрачного изображения, то есть вы можетесделать изображение более прозрачным.

0 голосов
/ 03 сентября 2016

Если вы используете Drawable для отображения изображения, вы можете изменить альфа следующим образом:

private Drawable mTriangle;
mTriangle = context.getResources().getDrawable(R.drawable.triangle_arrow_for_radar);

...

protected void onDraw(Canvas canvas)
{
    // Draw the triangle arrow
    float imageTargetWidth = getWidth() / 15;
    float scale = mTriangle.getIntrinsicWidth() / imageTargetWidth;

    int imgWidth  = (int)(imageTargetWidth);
    int imgHeight = (int)(mTriangle.getIntrinsicHeight() / scale);

    if (mTriangle != null)
    {
        mTriangle.setBounds(getWidth() / 2 - imgWidth / 2, getHeight() / 2 -       imgHeight / 2, getWidth() / 2 + imgWidth / 2, getHeight() / 2 + imgHeight / 2);

        mTriangle.setAlpha(150); // from (transparent) to 255 (opaque)
        mTriangle.draw(canvas);
    }
}
...