如何将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);
所以在查看(和使用)其他答案后,似乎他们都处理ColorDrawable
和PaintDrawable
糟糕。 (特别是在棒棒糖)似乎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); } } }