动态创建压缩的位图

时间:2014-05-21 18:58:10

标签: android memory-management printing bitmap compression

我正在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 * 4bytes)。即使在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专家。我不一定熟悉您可能用来回应的平台特定术语。请保持温和。

1 个答案:

答案 0 :(得分: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();