Как преобразовать Drawable в растровое изображение? - PullRequest
877 голосов
/ 14 июня 2010

Я хотел бы установить определенный Drawable в качестве обоев устройства, но все функции обоев принимают только Bitmap с.Я не могу использовать WallpaperManager, потому что я до 2.1.

Кроме того, мои документы загружаются из Интернета и не находятся в R.drawable.

Ответы [ 16 ]

1220 голосов
/ 14 июня 2010

Этот фрагмент кода помогает.

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

Здесь версия, в которую загружается изображение.

String name = c.getString(str_url);
URL url_value = new URL(name);
ImageView profile = (ImageView)v.findViewById(R.id.vdo_icon);
if (profile != null) {
    Bitmap mIcon1 =
        BitmapFactory.decodeStream(url_value.openConnection().getInputStream());
    profile.setImageBitmap(mIcon1);
}
700 голосов
/ 15 мая 2012
public 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());
    drawable.draw(canvas);
    return bitmap;
}
205 голосов
/ 14 июня 2010

Преобразует растровое изображение в растровое.

Drawable d = ImagesArrayList.get(0);  
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
134 голосов
/ 22 февраля 2012

A Drawable может быть нарисовано на Canvas, а Canvas может быть поддержано Bitmap:

(обновлено для обработки быстрого преобразования для BitmapDrawables и чтобы убедиться, что созданный Bitmap имеет действительный размер)

public static Bitmap drawableToBitmap (Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    int width = drawable.getIntrinsicWidth();
    width = width > 0 ? width : 1;
    int height = drawable.getIntrinsicHeight();
    height = height > 0 ? height : 1;

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

    return bitmap;
}
33 голосов
/ 02 февраля 2018

МЕТОД 1 : Либо вы можете напрямую конвертировать в растровое изображение, как это

Bitmap myLogo = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable);

МЕТОД 2 : вы даже можете конвертировать ресурс в отрисовку и изчто вы можете получить растровое изображение, подобное этому

Bitmap myLogo = ((BitmapDrawable)getResources().getDrawable(R.drawable.logo)).getBitmap();

Для API> 22 * ​​1012 * getDrawable метод перемещен в класс ResourcesCompat, так что вы делаете что-то подобное

Bitmap myLogo = ((BitmapDrawable) ResourcesCompat.getDrawable(context.getResources(), R.drawable.logo, null)).getBitmap();
31 голосов
/ 21 марта 2013

очень просто

Bitmap tempBMP = BitmapFactory.decodeResource(getResources(),R.drawable.image);
14 голосов
/ 18 декабря 2014

Так что после просмотра (и использования) других ответов кажется, что они все плохо обрабатывают ColorDrawable и PaintDrawable. (Особенно на леденцах) казалось, что Shader были подправлены, поэтому сплошные блоки цветов не обрабатывались правильно.

Я сейчас использую следующий код:

public static Bitmap drawableToBitmap(Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable) drawable).getBitmap();
    }

    // We ask for the bounds if they have been set as they would be most
    // correct, then we check we are  > 0
    final int width = !drawable.getBounds().isEmpty() ?
            drawable.getBounds().width() : drawable.getIntrinsicWidth();

    final int height = !drawable.getBounds().isEmpty() ?
            drawable.getBounds().height() : drawable.getIntrinsicHeight();

    // Now we check we are > 0
    final Bitmap bitmap = Bitmap.createBitmap(width <= 0 ? 1 : width, height <= 0 ? 1 : height,
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

В отличие от других, если вы позвоните setBounds на Drawable перед запросом превратить его в растровое изображение, оно будет отображать растровое изображение в правильном размере!

13 голосов
/ 08 февраля 2012

Может быть, это кому-нибудь поможет ...

От PictureDrawable до Bitmap, используйте:

private Bitmap pictureDrawableToBitmap(PictureDrawable pictureDrawable){ 
    Bitmap bmp = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bmp); 
    canvas.drawPicture(pictureDrawable.getPicture()); 
    return bmp; 
}

... реализовано так:

Bitmap bmp = pictureDrawableToBitmap((PictureDrawable) drawable);
10 голосов
/ 22 октября 2013

Вот лучшее разрешение

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

public static InputStream bitmapToInputStream(Bitmap bitmap) {
    int size = bitmap.getHeight() * bitmap.getRowBytes();
    ByteBuffer buffer = ByteBuffer.allocate(size);
    bitmap.copyPixelsToBuffer(buffer);
    return new ByteArrayInputStream(buffer.array());
}

Код из Как считывать отрисовываемые биты как InputStream

9 голосов
/ 30 декабря 2017

Вот хорошая версия ответа от Kotlin, предоставленная @ Chris.Jenkins здесь: https://stackoverflow.com/a/27543712/1016462

fun Drawable.toBitmap(): Bitmap {
  if (this is BitmapDrawable) {
    return bitmap
  }

  val width = if (bounds.isEmpty) intrinsicWidth else bounds.width()
  val height = if (bounds.isEmpty) intrinsicHeight else bounds.height()

  return Bitmap.createBitmap(width.nonZero(), height.nonZero(), Bitmap.Config.ARGB_8888).also {
    val canvas = Canvas(it)
    setBounds(0, 0, canvas.width, canvas.height)
    draw(canvas)
  }
}

private fun Int.nonZero() = if (this <= 0) 1 else this
...