Подтвердить что ты не робот

Как изменить непрозрачность растрового изображения?

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

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

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

4b9b3361

Ответ 1

Вы также можете попробовать 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);

Ответ 2

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

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

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

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

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

Ответ 3

Bitmap bgr = BitmapFactory.decodeResource(getResources(),R.drawable.main_logo_2);       
Paint transparentpainthack = new Paint();
transparentpainthack.setAlpha(100);
canvas.drawBitmap(bgr, 0, 0, transparentpainthack);

Ответ 4

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;
}

Ответ 5

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 вы можете изменить (а не reset) прозрачность уже прозрачного изображения, то есть вы можете сделать изображение более прозрачным.

Ответ 6

Если вы используете 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);
    }
}