2014-06-24 16 views
22

Tôi đã xem qua nhiều câu hỏi tương tự, mặc dù tôi không tìm thấy câu trả lời đúng cho truy vấn của mình.BitmapFactory.decodeResource() trả về null cho hình dạng được xác định trong xml drawable

Tôi có thể vẽ, quy định tại shape.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > 

    <solid android:color="@color/bg_color" /> 
</shape> 

Tôi muốn chuyển nó sang đối tượng Bitmap để thực hiện một số hoạt động, nhưng BitmapFactory.decodeResource() lợi nhuận null.

Đây là cách tôi đang làm nó:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.shape); 

Tôi đang làm gì sai? Có phải BitmapFactory.decodeResource() có thể áp dụng cho các bản vẽ được xác định xml không?

Trả lời

31

Vì bạn muốn tải một Drawable, không phải là một Bitmap, sử dụng này:

Drawable d = getResources().getDrawable(...); 

Để biến nó thành một Bitmap:

public static Bitmap drawableToBitmap (Drawable drawable) { 

    if (drawable instanceof BitmapDrawable) { 
     return ((BitmapDrawable)drawable).getBitmap(); 
    } 

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
    drawable.draw(canvas); 

    return bitmap; 
} 

lấy từ: How to convert a Drawable to a Bitmap?

+4

Tôi tự hỏi thế nào điều này có thể làm việc ... Kể từ khi drawable là một hình dạng xác định trong XML, 'getIntrinsicWidth()' và 'getIntrinsicHeight()' sẽ luôn luôn trả -1 và đồng Won bitmap không được tạo ra. Hay tôi nhận được một cái gì đó sai? –

+3

Điều này ném 'IllegalArgumentException: chiều rộng và chiều cao phải> 0' –

+0

Điều đó có nghĩa là drawable của bạn không có kích thước hợp lệ. –

1

nó là một drawable, không phải là một bitmap. Bạn nên sử dụng getDrawable thay

+0

Bạn không thể sử dụng 'getDrawable' trên ** StateListDrawable ** hoặc ** Shape ** –

1
public static Bitmap convertDrawableResToBitmap(@DrawableRes int drawableId, Integer width, Integer height) { 
    Drawable d = getResources().getDrawable(drawableId); 

    if (d instanceof BitmapDrawable) { 
     return ((BitmapDrawable) d).getBitmap(); 
    } 

    if (d instanceof GradientDrawable) { 
     GradientDrawable g = (GradientDrawable) d; 

     int w = d.getIntrinsicWidth() > 0 ? d.getIntrinsicWidth() : width; 
     int h = d.getIntrinsicHeight() > 0 ? d.getIntrinsicHeight() : height; 

     Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 
     g.setBounds(0, 0, w, h); 
     g.setStroke(1, Color.BLACK); 
     g.setFilterBitmap(true); 
     g.draw(canvas); 
     return bitmap; 
    } 

    Bitmap bit = BitmapFactory.decodeResource(getResources(), drawableId); 
    return bit.copy(Bitmap.Config.ARGB_8888, true); 
} 

//------------------------ 

Bitmap b = convertDrawableResToBitmap(R.drawable.myDraw , 50, 50); 
+0

thêm một số giải thích cho câu trả lời của bạn – RamPrakash

Các vấn đề liên quan