【问题标题】:BitmapFactory.decodeResource() returns null for shape defined in xml drawableBitmapFactory.decodeResource() 为 xml drawable 中定义的形状返回 null
【发布时间】:2014-08-14 20:35:27
【问题描述】:

我查看了多个类似的问题,尽管我没有找到适合我的问题的答案。

我有一个在 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>

我想将其转换为Bitmap对象以执行一些操作,但BitmapFactory.decodeResource()返回null。

这就是我的做法:

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

我做错了什么? BitmapFactory.decodeResource() 是否适用于 xml 定义的可绘制对象?

【问题讨论】:

    标签: android android-drawable xml-drawable


    【解决方案1】:

    由于您要加载Drawable,而不是Bitmap,请使用此:

    Drawable d = getResources().getDrawable(R.drawable.your_drawable, your_app_theme);
    

    把它变成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;
    }
    

    取自:How to convert a Drawable to a Bitmap?

    【讨论】:

    • 我想知道这是如何工作的...由于可绘制对象是在 XML 中定义的形状,getIntrinsicWidth()getIntrinsicHeight() 将始终返回 -1 并且不会创建位图。还是我搞错了?
    • 这会抛出IllegalArgumentException: width and height must be &gt; 0
    • 这意味着你的drawable没有一个有效的尺寸。
    • 使用新的支持库更新:使用 ContextCompat.GetDrawable(context, id)
    【解决方案2】:

    Android KTX 现在有一个将drawable转换为位图的扩展功能

    val bitmap = ContextCompat.getDrawable(context, R.drawable.ic_user_location_pin)?.toBitmap()
    
    if (bitmap != null) {
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap))
    }
    

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

      • 为你的答案添加一些解释
      【解决方案4】:

      它是可绘制的,而不是位图。你应该改用getDrawable

      【讨论】:

      • 您不能在 StateListDrawableShape 上使用 getDrawable
      【解决方案5】:

      您可能已将.xml 放入目录:.../drawable-24,并尝试将其放入.../drawable

      它对我有用,希望这可以帮助某人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        相关资源
        最近更新 更多