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