2014-05-21 3 views
0

Я пишу пользовательское приложение для печати на 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. Я не обязательно знаком с конкретными условиями платформы, которые вы можете использовать для ответа. Пожалуйста, будьте нежны.

+0

2-й параметр в 'compress' - это качество от 1 до 100. Я не уверен, почему вы используете 3. 'compress' не изменяет разрешение изображения, просто сжимайте размер. – ashishduh

+0

3 - случайное низкое значение для высокого сжатия, нет? – earthling

ответ

0

Попробуйте что-нибудь подобное, если у вас есть целевой размер в виду.

private static final int MAX_BYTES_IMAGE = 4194304; // 4MB 

//... 

ByteArrayOutputStream out; 
int quality = 90; 
do 
{ 
    out = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, out); 
    quality -= 10; 
} while (out.size() > MAX_BYTES_IMAGE_FILESIZE); 

out.close(); 
Смежные вопросы