Я пишу пользовательское приложение для печати на Android, и я ищу способы сохранения в памяти. У меня есть три основных прямоугольника, которые мне нужно распечатать на полной странице. В настоящее время я создаю базу Bitmap
размера страницы:Динамическое создание сжатого растрового изображения
_baseBitmap = Bitmap.createBitmap(width/_scale, height/_scale, Bitmap.Config.ARGB_8888);
Процесс печати запрашивает Rect
части этой страницы. Я не могу предопределить размеры этого Rect.
newBitmap = Bitmap.createBitmap(fullPageBitmap, rect.left/_scale, rect.top/_scale, rect.width()/_scale, rect.height()/_scale);
return Bitmap.createScaledBitmap(newBitmap, rect.width(), rect.height(), true);
Использование растрового конфигурации ARGB_8888 _baseBitmap
составляет около 28 МБ (8,5 "x11" @ 300dpi = 2250 * 3300 * 4 байта). Даже при 50% масштабировании (используется выше), мое изображение превышает 7 МБ. Масштабирование любого меньшего размера, а качество изображения слишком низкое.
Я попытался создать _baseBitmap
, используя Bitmap.Config.RGB_565
, что значительно уменьшает размер полного изображения, но затем, когда я накладываю изображение (jpegs), получаю смешные результаты. Изображение сжато по ширине, дублируется рядом с ним, и весь цвет зеленый.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = true;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap myBitmap = BitmapFactory.decodeStream(input, null, options);
input.close();
return myBitmap;
....
private static Bitmap overlay(Bitmap bmp1, Bitmap bmp2, float left, float top) {
Canvas canvas = new Canvas(bmp1);
canvas.drawBitmap(bmp2, left, top, null);
return bmp1;
}
Я знаю, что могу сжать изображение этих размеров до разумного размера. Я посмотрел в Bitmap.compress
, но по каким-то причинам вне моего понимания я получаю один и тот же размер обратно:
ByteArrayOutputStream os = new ByteArrayOutputStream();
_baseBitmap.compress(Bitmap.CompressFormat.JPEG, 3, os);
byte[] array = os.toByteArray();
Bitmap newBitmap = BitmapFactory.decodeByteArray(array, 0, array.length);
_baseBitmap.getAllocationByteCount()
== newBitmap.getAllocationByteCount()
Было бы лучше, чтобы создать его сжатый, чем создавать большой, а затем сжать его. Есть ли способ до создать сжатый растровый? Любые советы высоко ценится.
примечание: не эксперт по Android. Я не обязательно знаком с конкретными условиями платформы, которые вы можете использовать для ответа. Пожалуйста, будьте нежны.
2-й параметр в 'compress' - это качество от 1 до 100. Я не уверен, почему вы используете 3. 'compress' не изменяет разрешение изображения, просто сжимайте размер. – ashishduh
3 - случайное низкое значение для высокого сжатия, нет? – earthling