如何从可绘制对象加载图像并将其转换为位图
How to load an image from drawable and convert to a bitmap
我在 drawable 文件夹中有一张图片,我想转换成位图,然后转换成 byte[] 存储到数据库中,我可以将位图转换成字节数组,但我做不到从 Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.image);
returns null 开始从 drawable 中获取图像。怎么做?
我现在有什么
Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.image); //this returns null
if(photo != null)
byte[] bytes = getBitmapAsByteArray(photo);
//this works
DatabaseHelper databaseHelper = new DatabaseHelper(this);
databaseHelper.add("DEFAULT",bytes);
更新:
当我使用 photo.setImageBitmap(bitmap);
将位图设置为图像时,它从数据库中检索信息后它没有出现,似乎商店不起作用
我正在像这样将信息存储到数据库中
private static byte[] getBitmapAsByteArray(Bitmap bitmap) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
return outputStream.toByteArray();
}
public boolean addUserInformation(String username, byte[] picture){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("USERNAME", username);
if(picture!=null) {
values.put("PICTURE", picture);
}
id = db.insert(TABLE_NAME1, null, values);
}
db.close();
if(id == -1)
return false;
else
return true;
}
并像这样检索信息
Cursor data = databaseHelper.getUserInformation();
if(data.moveToFirst()) {
mUsername = data.getString(1);
bytes = data.getBlob(2);
if(bytes!=null)
profilePhoto = BitmapFactory.decodeByteArray(bytes, 0, data.getBlob(2).length);
}
在数据库中使用 getUserInformation() class
public Cursor getUserInformation(){
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * FROM " + TABLE_NAME1;
Cursor c = db.rawQuery(query,null);
return c;
}
使用这个
Bitmap photo = ((BitmapDrawable) getDrawable(R.drawable.R.drawable.image)).getBitmap();
希望工作顺利 ;)
以下方法应该可以正常工作:
public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
Drawable drawable = ContextCompat.getDrawable(context, drawableId);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
drawable = (DrawableCompat.wrap(drawable)).mutate();
}
Bitmap 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;
}
build.gradle (project-level)
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-alpha5'
}
build.gradle (app-level)
android {
compileSdkVersion 23
buildToolsVersion '23.0.3'
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
vectorDrawables.useSupportLibrary = true
}
...
}
...
或者,您也可以像这样在 Kotlin 中使用 android-ktx
,它适用于 Drawable
的任何子类:
build.gradle
dependencies {
implementation 'androidx.core:core-ktx:1.0.0-alpha1'
}
然后像这样使用 Drawable#toBitmap()
:
val bitmap = AppCompatResources.getDrawable(requireContext(), drawableId).toBitmap()
您可以通过一种非常简单的方式来做到这一点。像这样将 Glide 添加到您的项目中 -
implementation 'com.github.bumptech.glide:glide:4.9.0'
然后取一个全局位图变量并像这样调用-
私有位图imageBitmap;
Glide.with(this)
.asBitmap()
.load(R.drawable.image)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
//Save the bitmap to your global bitmap
imageBitmap = resource;
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
现在将 imageBitmap 传递给您的 getBitmapAsByteArray() 以转换为 byteArray,以便您可以将其保存在您的 SQLite 数据库中。
希望对您有所帮助!
我在 drawable 文件夹中有一张图片,我想转换成位图,然后转换成 byte[] 存储到数据库中,我可以将位图转换成字节数组,但我做不到从 Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.image);
returns null 开始从 drawable 中获取图像。怎么做?
我现在有什么
Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.image); //this returns null
if(photo != null)
byte[] bytes = getBitmapAsByteArray(photo);
//this works
DatabaseHelper databaseHelper = new DatabaseHelper(this);
databaseHelper.add("DEFAULT",bytes);
更新:
当我使用 photo.setImageBitmap(bitmap);
将位图设置为图像时,它从数据库中检索信息后它没有出现,似乎商店不起作用
我正在像这样将信息存储到数据库中
private static byte[] getBitmapAsByteArray(Bitmap bitmap) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
return outputStream.toByteArray();
}
public boolean addUserInformation(String username, byte[] picture){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("USERNAME", username);
if(picture!=null) {
values.put("PICTURE", picture);
}
id = db.insert(TABLE_NAME1, null, values);
}
db.close();
if(id == -1)
return false;
else
return true;
}
并像这样检索信息
Cursor data = databaseHelper.getUserInformation();
if(data.moveToFirst()) {
mUsername = data.getString(1);
bytes = data.getBlob(2);
if(bytes!=null)
profilePhoto = BitmapFactory.decodeByteArray(bytes, 0, data.getBlob(2).length);
}
在数据库中使用 getUserInformation() class
public Cursor getUserInformation(){
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT * FROM " + TABLE_NAME1;
Cursor c = db.rawQuery(query,null);
return c;
}
使用这个
Bitmap photo = ((BitmapDrawable) getDrawable(R.drawable.R.drawable.image)).getBitmap();
希望工作顺利 ;)
以下方法应该可以正常工作:
public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
Drawable drawable = ContextCompat.getDrawable(context, drawableId);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
drawable = (DrawableCompat.wrap(drawable)).mutate();
}
Bitmap 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;
}
build.gradle (project-level)
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-alpha5'
}
build.gradle (app-level)
android {
compileSdkVersion 23
buildToolsVersion '23.0.3'
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
vectorDrawables.useSupportLibrary = true
}
...
}
...
或者,您也可以像这样在 Kotlin 中使用 android-ktx
,它适用于 Drawable
的任何子类:
build.gradle
dependencies {
implementation 'androidx.core:core-ktx:1.0.0-alpha1'
}
然后像这样使用 Drawable#toBitmap()
:
val bitmap = AppCompatResources.getDrawable(requireContext(), drawableId).toBitmap()
您可以通过一种非常简单的方式来做到这一点。像这样将 Glide 添加到您的项目中 -
implementation 'com.github.bumptech.glide:glide:4.9.0'
然后取一个全局位图变量并像这样调用-
私有位图imageBitmap;
Glide.with(this)
.asBitmap()
.load(R.drawable.image)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
//Save the bitmap to your global bitmap
imageBitmap = resource;
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
现在将 imageBitmap 传递给您的 getBitmapAsByteArray() 以转换为 byteArray,以便您可以将其保存在您的 SQLite 数据库中。
希望对您有所帮助!