将drawable转换为位图并修改其颜色

时间:2015-09-22 07:33:33

标签: android bitmap

因为我需要将drawable作为位图描述符,所以我将资源转换为Drawable然后转换为Bitmap

但是我想改变它的颜色,所以我在这里使用了以下代码:

private static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;

    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());

    int iColor = Color.parseColor("#006f00");

    drawable.setColorFilter(iColor, PorterDuff.Mode.SRC_ATOP);

    drawable.draw(canvas);
    return bitmap;
}

但是可绘制的颜色仍然是黑色。 你能告诉我为什么以及如何让它发挥作用?

5 个答案:

答案 0 :(得分:1)

这会将BitmapDrawable转换为位图。

Drawable d = ImagesArrayList.get(0);  
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();

如需更改位图的颜色,请参阅以下链接

How to change Bitmap image color in android?

答案 1 :(得分:1)

试试这个,

将资源转换为drawable。

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

将drawable转换为位图。

Bitmap myLogo = ((BitmapDrawable) myIcon).getBitmap();

更改位图的颜色。

Bitmap sourceBitmap = BitmapFactory.decodeFile(imgPath);
    float[] colorTransform = {
            0, 1f, 0, 0, 0, 
            0, 0, 0f, 0, 0,
            0, 0, 0, 0f, 0, 
            0, 0, 0, 1f, 0};

    ColorMatrix colorMatrix = new ColorMatrix();
    colorMatrix.setSaturation(0f); //Remove Colour 
    colorMatrix.set(colorTransform); //Apply the Red

    ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
    Paint paint = new Paint();
    paint.setColorFilter(colorFilter);   

    Display display = getWindowManager().getDefaultDisplay(); 

    Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, (int)(display.getHeight() * 0.15), display.getWidth(), (int)(display.getHeight() * 0.75));            

    image.setImageBitmap(resultBitmap);

    Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, paint);

乐意帮助你。

答案 2 :(得分:0)

我认为问题可能是PorterDuff.Mode.SRC_ATOP,您用于应用过滤器的方法。我不是专门知道SRC_ATOP,但是link解释了所有这些。

我不知道你的图像是如何编写的,但我使用的是DST_ATOP而不是SRC_ATOP

编辑:我认为这个代码在您正在分析的情况下不会返回,并且如果它返回过滤器显然永远不会到达。

if (drawable instanceof BitmapDrawable) 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
    if(bitmapDrawable.getBitmap() != null) {
        return bitmapDrawable.getBitmap();
    }
}

答案 3 :(得分:0)

Paint p = new Paint();
ColorFilter filter = new LightingColorFilter(Color.RED, 0);
p.setColorFilter(filter);
canvas.drawBitmap(bitmap, 0, 0, p);

答案 4 :(得分:0)

要将drawable转换为位图,请使用此 -

Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
                                       R.drawable.icon_resource);

您可以通过此更改位图像素颜色 -

int[] pixels = new int[myBitmap.getHeight()*myBitmap.getWidth()];
myBitmap.getPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());
for (int i=0; i<myBitmap.getWidth()*5; i++)
    pixels[i] = Color.BLUE;
myBitmap.setPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());