我正在开发一个图像处理应用程序,它必须能够处理大图像,例如那些由相机拍摄的图像,我采用的方法是将源图像拆分为多个大小合适的图 block ,以便可以将图 block 作为位图单独加载到内存中,而不会超过可怕的 VM 限制,下一次图像处理是在逐个瓷砖,这一切都很好,但直到我想将这些瓷砖拼接回最终的 jpeg 图像。
我正在寻找可以执行以下操作的内置 sdk api 或免费软件解决方案:
除了编写我自己的 jpeg 编码器之外,还有什么想法或建议吗?
最佳答案
这个怎么样:
FileOutputStream outFile = new FileOutputStream(output_file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outFile);
outFile.flush();
outFile.close();
您可以调整质量设置 (100)。查看docs
您仍然需要决定如何对其进行切片。但是,如果您是在设备上拍摄图像,如果一开始没有引起内存问题,为什么加载整个图像会出现问题?
将 Tiles 重新拼接在一起:这是我知道有效的 slippy maps 使用的一种简单方法。
- 以标准尺寸(比如 256x256)切割瓷砖
- 为每个图 block 分配一个 x,y 值 - 这可以是目录结构或文件名约定:即“0_0.jpg”
- 图 block 名称(数字)与其顶部/左侧像素位置相关。
每个图 block 编号可以通过以下方式计算:
tileX = floor(pixelX/256)
tileY = floor(pixelY/256)
因此像素 0,0 处的瓦片 = 瓦片 (0,0),像素 256,0 处的瓦片是瓦片 (1,0),等等...
关于Android 将多个位图图 block 流式传输到单个 jpeg 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507595/