ฉันต้องการตั้งค่าบางอย่างDrawable
เป็นวอลล์เปเปอร์ของอุปกรณ์ แต่ฟังก์ชั่นวอลล์เปเปอร์ทั้งหมดยอมรับBitmap
เฉพาะ ฉันไม่สามารถใช้WallpaperManager
เพราะฉันก่อน 2.1
R.drawable
นอกจากนี้ยังมีภาพวาดของฉันจะถูกดาวน์โหลดจากเว็บและไม่ได้อาศัยอยู่ใน
ฉันต้องการตั้งค่าบางอย่างDrawable
เป็นวอลล์เปเปอร์ของอุปกรณ์ แต่ฟังก์ชั่นวอลล์เปเปอร์ทั้งหมดยอมรับBitmap
เฉพาะ ฉันไม่สามารถใช้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;
}
getIntrinsicWidth()
และgetIntrinsicHieght()
จะคืนค่า -1 ถ้า drawable เป็นสีทึบ
สิ่งนี้จะแปลง BitmapDrawable เป็น Bitmap
Drawable d = ImagesArrayList.get(0);
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
BitmapDrawable
ก่อนที่จะหล่อมัน if (d instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); }
d
มีอยู่แล้วเป็นBitmapDrawable
ซึ่งในกรณีนี้มันเป็นเรื่องเล็ก ๆ น้อย ๆ ที่จะดึงมันเป็นบิตแมป ... จะผิดพลาดกับClassCastException
ในกรณีอื่น ๆ
Drawable
สามารถวาดลงบนCanvas
และCanvas
สามารถรับการสนับสนุนโดยBitmap
:
(อัปเดตเพื่อจัดการกับการแปลงอย่างรวดเร็วสำหรับBitmapDrawable
s และเพื่อให้แน่ใจว่าการ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;
}
วิธีที่ 1 : คุณสามารถแปลงเป็นบิตแมปแบบนี้ได้โดยตรง
Bitmap myLogo = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable);
วิธีที่ 2 : คุณสามารถแปลงทรัพยากรเป็นแบบวาดได้และจากนั้นคุณจะได้รับบิตแมปแบบนี้
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();
android.graphics.drawable.VectorDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
ง่ายมาก
Bitmap tempBMP = BitmapFactory.decodeResource(getResources(),R.drawable.image);
ดังนั้นหลังจากดู (และใช้) คำตอบอื่น ๆ ดูเหมือนว่าพวกเขาจัดการ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
ก่อนที่จะขอที่จะเปิดเป็นบิตแมปก็จะวาดบิตแมปที่ขนาดที่ถูกต้อง!
Drawable
IntrinsicWidth/Height
หากทั้งคู่ <= 0 เราตั้งค่า canvas เป็น 1px คุณถูกต้องหากDrawable
ไม่มีขอบเขตมันจะถูกส่งผ่านบางส่วน (1x1 เป็นกรณีส่วนใหญ่) แต่สิ่งนี้จำเป็นสำหรับสิ่งColorDrawable
ที่ไม่ได้มีขนาดที่แท้จริง ถ้าเราไม่ทำเช่นนี้มันจะขว้างException
คุณไม่สามารถวาด 0x0 ลงบนผืนผ้าใบได้
mutate()
จะทำสำเนาออกจาก drawable ต้นฉบับเพียงอย่างเดียวซึ่งจะลบล้างปัญหาของการส่งกลับในขอบเขตเดิม ฉันไม่ค่อยจะเปลี่ยนรหัสตามประเด็นเหล่านั้น หากกรณีการใช้งานของคุณต้องการมันจะเพิ่มคำตอบอื่น ฉันขอแนะนำให้คุณสร้างคำถามอื่นสำหรับมาตราส่วนบิตแมป
บางทีนี่อาจช่วยคน ...
จาก 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);
Drawable
PictureDrawable
นี่คือความละเอียดที่ดีกว่า
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());
}
1) drawable to Bitmap:
Bitmap mIcon = BitmapFactory.decodeResource(context.getResources(),R.drawable.icon);
// mImageView.setImageBitmap(mIcon);
2) บิตแมปถึง Drawable:
Drawable mDrawable = new BitmapDrawable(getResources(), bitmap);
// mImageView.setDrawable(mDrawable);
นี่คือรุ่น 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
android-ktx มีDrawable.toBitmap
วิธีการ: https://android.github.io/android-ktx/core-ktx/androidx.graphics.drawable/android.graphics.drawable.-drawable/to-bitmap.html
จาก Kotlin
val bitmap = myDrawable.toBitmap()
VectorDrawable
ใน Kotlin! แชร์ในโพสต์ SO นี้ที่นี่ด้วยรายละเอียดเพิ่มเติม
Android BitmapDrawable
ให้การแก้ปัญหานอนที่ไม่ตรง ที่จะได้รับบิตแมปที่เราจะต้องให้ ID ทรัพยากรR.drawable.flower_pic
เพื่อที่แล้วโยนมันทิ้งไปBitmapDrawable
Bitmap
Bitmap bm = ((BitmapDrawable) getResources().getDrawable(R.drawable.flower_pic)).getBitmap();
ใช้รหัสนี้จะช่วยให้คุณบรรลุเป้าหมาย
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;
}
BitmapFactory.decodeResource()
สเกลบิตแมปโดยอัตโนมัติดังนั้นบิตแมปของคุณอาจกลายเป็นคลุมเครือ เพื่อป้องกันการปรับขนาดให้ทำสิ่งนี้:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap source = BitmapFactory.decodeResource(context.getResources(),
R.drawable.resource_name, options);
หรือ
InputStream is = context.getResources().openRawResource(R.drawable.resource_name)
bitmap = BitmapFactory.decodeStream(is);
ถ้าคุณใช้ kotlin ให้ใช้โค้ดด้านล่าง มันจะทำงาน
// สำหรับการใช้เส้นทางภาพ
val image = Drawable.createFromPath(path)
val bitmap = (image as BitmapDrawable).bitmap
ไลบรารี androidx core ล่าสุด (androidx.core: core-ktx: 1.2.0) ตอนนี้มีฟังก์ชันส่วนขยาย:Drawable.toBitmap(...)
เพื่อแปลง Drawable เป็น Bitmap
// 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);
}
}
}
ImageWorker Library สามารถแปลงบิตแมปเป็น drawable หรือ base64 และในทางกลับกัน
val bitmap: Bitmap? = ImageWorker.convert().drawableToBitmap(sourceDrawable)
การดำเนินงาน
ในระดับโครงการ
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
ในระดับการสมัคร Gradle
dependencies {
implementation 'com.github.1AboveAll:ImageWorker:0.51'
}
คุณยังสามารถจัดเก็บและดึงภาพบิตแมป / drawables / base64 จากภายนอก
ตรวจสอบที่นี่ https://github.com/1AboveAll/ImageWorker/edit/master/README.md