2
votes

Comment charger une image à partir d'un dessin et la convertir en bitmap

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);


4 commentaires

pourquoi voudriez-vous "convertir" VectorDrawable en pixels bruts? l'objectif principal de VectorDrawable est d'éviter les graphiques pixellisés et d'utiliser des graphiques vectoriels à la place


J'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


3 Réponses :


0
votes

Utilisez ceci

Bitmap photo = ((BitmapDrawable) getDrawable (R.drawable.R.drawable.image)). getBitmap ();

j'espère que ça marche bien;)


2 commentaires

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.



2
votes

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;
}


2 commentaires

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);



0
votes

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'


0 commentaires