Как преобразовать рисование в растровое изображение?
Я хотел бы установить определенный Drawable в качестве обоев устройства, но все функции обоев принимают Bitmapтолько s. Я не могу использовать WallpaperManager потому что я до 2.1.
кроме того, мои чертежи загружаются из интернета и не находятся в R.drawable.
14 ответов:
этот кусок кода поможет.
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();
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; }
используйте этот код:
Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_name);
метод 1: либо вы можете напрямую конвертировать в растровое изображение, как это
Bitmap myLogo = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable);Метод 2 : вы даже можете конвертировать ресурс в drawable и от этого вы можете получить растровое изображение, как это
Bitmap myLogo = ((BitmapDrawable)getResources().getDrawable(R.drawable.logo)).getBitmap();для API > 22
getDrawableметод перемещен вResourcesCompatкласс так что вы делаете что-то вроде этогоBitmap myLogo = ((BitmapDrawable) ResourcesCompat.getDrawable(context.getResources(), R.drawable.logo, null)).getBitmap();
может быть, это поможет кому-то...
из 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);
Итак, после просмотра (и использования) других ответов, кажется, что они все обрабатывают
ColorDrawableиPaintDrawableплохо. (Особенно на леденец) казалось, чтоShaders были настроены так твердые блоки цветов не были обработаны правильно.Я использую следующий код:
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прежде чем попросить превратить его в растровое изображение, он нарисует растровое изображение в правильном размере!
вот лучшее разрешение
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()); }
Android предоставляет не прямое решение foward:
BitmapDrawable. Чтобы получить растровое изображение , мы должны предоставить идентификатор ресурсаR.drawable.flower_picдоBitmapDrawableа затем бросьте его вBitmap.Bitmap bm = ((BitmapDrawable) getResources().getDrawable(R.drawable.flower_pic)).getBitmap();
вот хорошая версия Kotlin ответа, предоставленного @Chris.Дженкинс здесь: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
используйте это 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); } } }
Comments