如何将Drawable转换为位图?

我想设置一个特定的Drawable作为设备的壁纸,但所有壁纸function只接受Bitmap s。 我无法使用WallpaperManager因为我在2.1之前。

此外,我的绘图从网上下载,不居住在R.drawable

这段代码有帮助。

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

这将BitmapDrawable转换为位图。

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

一个Drawable可以绘制到一个Canvas ,而一个Canvas可以由一个Bitmap来支持:

(更新后可处理BitmapDrawable的快速转换,并确保创build的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; } 

使用此代码:

 Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_name); 

从资源中获取可绘制的资源

 Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.index); 

2.从url中获取图片

 String urlString = "http://your image url"; URL url = new URL(urlString); ImageView imageView = (ImageView)findViewById(R.id.userImage); if (imageView != null) { Bitmap bmIcon = BitmapFactory.decodeStream(url_url.openConnection().getInputStream()); imageView.setImageBitmap(bmIcon); } 

很简单

 Bitmap tempBMP = BitmapFactory.decodeResource(getResources(),R.drawable.image); 

也许这会帮助别人…

从PictureDrawable到位图,使用:

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

所以在查看(和使用)其他答案后,似乎他们都处理ColorDrawablePaintDrawable糟糕。 (特别是在棒棒糖)似乎Shader s被调整,所以固体块的颜色处理不正确。

我现在使用下面的代码:

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

与其他人不同的是,如果在要求将Drawable转换为位图之前调用setBounds ,它将以正确的大小绘制位图!

这是更好的决议

 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

Android提供了一个非直接的解决scheme: BitmapDrawable 。 为了获得位图,我们必须将资源ID R.drawable.flower_pic提供给BitmapDrawable ,然后将其转换为Bitmap

 Bitmap bm = ((BitmapDrawable) getResources().getDrawable(R.drawable.flower_pic)).getBitmap(); 

下面的代码将把Drawable转换成一个Bitmap

 Drawable myDrawable = ImagesArrayList.get(0); Bitmap myBitmap = ((BitmapDrawable)myDrawable).getBitmap(); 

使用这个code.it将帮助你实现你的目标。

  Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.profileimage); if (bmp!=null) { Bitmap bitmap_round=getRoundedShape(bmp); if (bitmap_round!=null) { profileimage.setImageBitmap(bitmap_round); } } public Bitmap getRoundedShape(Bitmap scaleBitmapImage) { int targetWidth = 100; int targetHeight = 100; Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(targetBitmap); Path path = new Path(); path.addCircle(((float) targetWidth - 1) / 2, ((float) targetHeight - 1) / 2, (Math.min(((float) targetWidth), ((float) targetHeight)) / 2), Path.Direction.CCW); canvas.clipPath(path); Bitmap sourceBitmap = scaleBitmapImage; canvas.drawBitmap(sourceBitmap, new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()), new Rect(0, 0, targetWidth, targetHeight), new Paint(Paint.FILTER_BITMAP_FLAG)); return targetBitmap; } 
  // get image path from gallery protected void onActivityResult(int requestCode, int resultcode, Intent intent) { super.onActivityResult(requestCode, resultcode, intent); if (requestCode == 1) { if (intent != null && resultcode == RESULT_OK) { Uri selectedImage = intent.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); filePath = cursor.getString(columnIndex); //display image using BitmapFactory cursor.close(); bmp = BitmapFactory.decodeFile(filepath); iv.setBackgroundResource(0); iv.setImageBitmap(bmp); } } }