2014-05-21 70 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是大約28MB(8.5 「X11」 @ 300dpi的= 2250 * 3300 * 4字節)。即使在50%縮放比例(以上使用)下,我的圖片也超過了7MB。縮小比這更小的圖像質量太差。

我試圖創建_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

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