Как загрузить изображение из нарисованного и преобразовать в растровое изображение - PullRequest
2 голосов
/ 30 июня 2019

У меня есть изображение в папке drawable, и я хочу преобразовать его в растровое изображение, а затем преобразовать в byte [], чтобы сохранить в базе данных, я могу преобразовать растровое изображение в байтовый массив, но я не могу получить изображение из drawable, так как Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.image); возвращает ноль. Как это сделать?

что у меня есть на данный момент

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

UPDATE: когда я устанавливаю растровое изображение на изображение с 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 () внутри класса базы данных

public Cursor getUserInformation(){
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME1;
        Cursor c = db.rawQuery(query,null);
        return c;
    }

Ответы [ 3 ]

1 голос
/ 30 июня 2019

Следующий метод должен работать нормально:

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

Или вы также можете использовать android-ktx в Kotlin, как это работает для любого подкласса Drawable:

build.gradle

dependencies {
    implementation 'androidx.core:core-ktx:1.0.0-alpha1'
}

Затем используйте Drawable#toBitmap(), например:

val bitmap = AppCompatResources.getDrawable(requireContext(), drawableId).toBitmap() 
0 голосов
/ 30 июня 2019

Вы можете сделать это очень простым способом. Добавьте Glide к своему проекту, как это -

implementation 'com.github.bumptech.glide:glide:4.9.0'

Затем возьмите глобальную переменную Bitmap и позвоните так:

частное растровое изображение 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.

Надеюсь, это поможет!

0 голосов
/ 30 июня 2019

Используйте это

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

, надеюсь, отлично работает;)

...