특정 Drawable
장치를 바탕 화면으로 설정하고 싶지만 모든 바탕 화면 기능은 Bitmap
s 만 허용 합니다. WallpaperManager
2.1 세 이전이므로 사용할 수 없습니다 .
또한 내 드로어 블은 웹에서 다운로드되며에 없습니다 R.drawable
.
특정 Drawable
장치를 바탕 화면으로 설정하고 싶지만 모든 바탕 화면 기능은 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;
}
getIntrinsicWidth()
및 getIntrinsicHieght()
반환 -1 당김이 단색 인 경우.
BitmapDrawable을 비트 맵으로 변환합니다.
Drawable d = ImagesArrayList.get(0);
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
BitmapDrawable
캐스팅하기 전에 확인할 수 있습니다. if (d instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); }
d
이미 이미 있는 경우에만 작동합니다 .이 경우 비트 맵으로 검색하는 것이 쉽지 않습니다 ... 다른 모든 경우 와 충돌 합니다. BitmapDrawable
ClassCastException
에 a Drawable
를 그릴 수 있고 Canvas
a 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
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;
}
다른 사람과는 달리, 당신이 호출하면 setBounds
온 Drawable
비트 맵으로 바꿀 것을 요청하기 전에, 그것은 올바른 크기의 비트 맵을 그릴 것입니다!
Drawable
경계가 설정되어 있지 않으면를 사용합니다 IntrinsicWidth/Height
. 둘 다 <= 0이면 캔버스를 1px로 설정합니다. Drawable
범위가 없으면 일부가 전달되지만 (1x1이 대부분의 경우) 정확 하지만 ColorDrawable
고유 크기가 없는 것과 같은 경우에는 필수입니다 . 이 작업을 수행하지 않으면을 throw Exception
하고 캔버스에 0x0을 그릴 수 없습니다.
mutate()
원래의 드로어 블을 남겨두고 사본을 만들어 원래의 경계로 돌아가는 문제를 무효화합니다. 그 점에 따라 코드를 거의 변경하지 않습니다. 사용 사례에 따라 다른 답변을 추가하십시오. 비트 맵 스케일링에 대한 다른 질문을 작성하는 것이 좋습니다.
어쩌면 이것은 누군가를 도울 것입니다 ...
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
의이 경우에는 a 가 필요 합니다 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());
}
@ Chris.Jenkins가 제공하는 멋진 Kotlin 버전의 답변은 다음과 같습니다. 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
코 틀린에서
val bitmap = myDrawable.toBitmap()
이 코드를 사용하면 목표를 달성하는 데 도움이됩니다.
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 코어 라이브러리 (androidx.core : core-ktx : 1.2.0)에는 이제 Drawable을 비트 맵으로 변환 하는 확장 기능이Drawable.toBitmap(...)
있습니다.
// 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 라이브러리는 비트 맵을 드로어 블 또는 base64로 또는 그 반대로 변환 할 수 있습니다.
val bitmap: Bitmap? = ImageWorker.convert().drawableToBitmap(sourceDrawable)
이행
프로젝트 레벨 Gradle에서
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
응용 프로그램 레벨 Gradle에서
dependencies {
implementation 'com.github.1AboveAll:ImageWorker:0.51'
}
외부에서 비트 맵 / 드로어 블 / base64 이미지를 저장하고 검색 할 수도 있습니다.
여기를 확인하십시오. https://github.com/1AboveAll/ImageWorker/edit/master/README.md