J'ai une image dans le dossier pouvant être dessiné et je souhaite la convertir en bitmap puis la convertir en octet [] pour la stocker dans une base de données, je peux convertir le bitmap en tableau d'octets mais je ne parviens pas à obtenir le image tirée depuis Bitmap photo = BitmapFactory.decodeResource (getResources (), R.drawable.image);
renvoie null. Comment faire?
ce que j'ai pour le moment
public Cursor getUserInformation(){ SQLiteDatabase db = this.getReadableDatabase(); String query = "SELECT * FROM " + TABLE_NAME1; Cursor c = db.rawQuery(query,null); return c; }
MISE À JOUR:
lorsque je règle le bitmap sur image avec photo.setImageBitmap (bitmap);
après avoir récupéré les informations de la base de données, il n'apparaît pas, il semble que le magasin ne fonctionne pas
Je suis stocker des informations dans une base de données comme celle-ci
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); }
et récupérer des informations comme celle-ci
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; }
avec getUserInformation () dans la classe de base de données p>
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);
3 Réponses :
Utilisez ceci
Bitmap photo = ((BitmapDrawable) getDrawable (R.drawable.R.drawable.image)). getBitmap ();
j'espère que ça marche bien;)
crash avec android.graphics.drawable.VectorDrawable ne peut pas être converti en android.graphics.drawable.BitmapDrawable. En outre, il nécessite le niveau d'API 21, existe-t-il un moyen d'inclure également des API plus anciennes?
Cela ne devrait fonctionner que si le dessinable est déjà un BitmapDrawable
. Devrait planter avec ClassCastException
dans tous les autres cas, lorsque le dessinable est autre chose que BitmapDrawable
, comme VectorDrawable
ou LayerDrawable
ou ScaleDrawable
etc.
La méthode suivante devrait fonctionner correctement:
val bitmap = AppCompatResources.getDrawable(requireContext(), drawableId).toBitmap()
build.gradle (au niveau du projet)
dependencies { implementation 'androidx.core:core-ktx:1.0.0-alpha1' }
build.gradle (niveau application)
android { compileSdkVersion 23 buildToolsVersion '23.0.3' defaultConfig { minSdkVersion 16 targetSdkVersion 23 vectorDrawables.useSupportLibrary = true } ... } ...
Ou, vous pouvez également utiliser android-ktx
dans Kotlin comme ceci qui fonctionne pour n'importe quelle sous-classe de Drawable
:
build.gradle
dependencies { classpath 'com.android.tools.build:gradle:2.2.0-alpha5' }
Ensuite, utilisez Drawable # toBitmap ()
comme ceci:
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; }
ne reconnaît pas la classe BitmapDescriptor qu'il me donne ne peut pas résoudre le symbole, quelle bibliothèque dois-je importer?
@james, puis utilisez AppCompatResources
au lieu de ContextCompat
ici dans cette ligne: Drawable drawable = AppCompatResources.getDrawable (context, drawableId);
Vous pouvez le faire d'une manière très simple. Ajoutez Glide à votre projet comme ceci -
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) { } });
Ensuite, prenez une variable Bitmap globale et appelez comme ceci-
Private Bitmap imageBitmap;
implementation 'com.github.bumptech.glide:glide:4.9.0'
pourquoi voudriez-vous "convertir"
VectorDrawable
en pixels bruts? l'objectif principal deVectorDrawable
est d'éviter les graphiques pixellisés et d'utiliser des graphiques vectoriels à la placeJ'ai besoin de stocker l'image dans une base de données SQLite sous forme de tableau d'octets
alors pourquoi utilisez-vous
VectorDrawable
?que dois-je utiliser pour prendre une image .xml du dossier dessinable et la convertir en un tableau d'octets? @pskink