Изображение из ресурсов масштабируется должным образом, а изображение из SQlite - Android - PullRequest
0 голосов
/ 15 августа 2011

У меня странная проблема. У меня есть несколько изображений в моем проекте Android, которые я сохранил как файлы .png в папке res \ drawable. Мне удалось легко извлечь изображения во время выполнения и преобразовать их в растровое изображение, например так:

Drawable d = getResources().getDrawable(R.drawable.imageId);
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();

Это прекрасно работает, и изображение корректно масштабируется независимо от плотности экрана устройства. Все мои изображения имеют размер 200 на 200 пикселей, а мой макет изображения настроен как 200 точек на дюйм.

Теперь я сохранил все изображения в виде больших двоичных объектов в базе данных SQlite из-за проблем с масштабируемостью, и я извлекаю их во время выполнения и преобразовываю в растровое изображение следующим образом:

byte[] bb = cursor.getBlob(columnIndex);
Bitmap bitmap = BitmapFactory.decodeByteArray(bb, 0, bb.length);

Изображение отображается нормально, если плотность экрана стандартная 160 dip. Но если плотность меньше или больше, изображение не масштабируется и остается 200 пикселей на 200 пикселей для 160 провалов. Таким образом, в основном, на меньшем экране (120 точек на дюйм) изображение занимает больше места, чем должно, а на большом экране (240 точек на дюйм) оно занимает меньше места, чем должно.

Кто-нибудь еще сталкивался с этой странной проблемой? Любое объяснение, обходной путь, решение будут действительно оценены.

Большое спасибо заранее!

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Хорошо, наконец-то я начал работать с помощью createScaledBitmap ().

После создания растрового изображения из большого двоичного объекта я вычисляю коэффициент масштабирования, а затем вычисляю новые ширину и высоту.Затем я использую их в функции createScaledBitmap ().Вот код, который работает:

public static Bitmap getImageFromBlob(byte[] mBlob) 
{
    byte[] bb = mBlob;
    Bitmap b = BitmapFactory.decodeByteArray(bb, 0, bb.length); 
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int newWidth = b.getWidth()*metrics.densityDpi)/DisplayMetrics.DENSITY_DEFAULT;
    int newHeight = b.getHeight()*metrics.densityDpi)/DisplayMetrics.DENSITY_DEFAULT;
    return Bitmap.createScaledBitmap(b, newWidth, newHeight,  true);
}

Эта ссылка предоставила ключ: разница между методами для масштабирования растрового изображения

0 голосов
/ 29 мая 2012

работал для меня, см. это . Но я должен сказать, я думаю, что SQLite делает это правильно, и размер отрисовки для Android имеет неправильный размер.

0 голосов
/ 15 августа 2011

Используйте decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts) и в опциях установите inDesity, чтобы сказать 160.

...