Android 将多个位图图 block 流式传输到单个 jpeg 文件

标签 android image-manipulation jpeg

我正在开发一个图像处理应用程序,它必须能够处理大图像,例如那些由相机拍摄的图像,我采用的方法是将源图像拆分为多个大小合适的图 block ,以便可以将图 block 作为位图单独加载到内存中,而不会超过可怕的 VM 限制,下一次图像处理是在逐个瓷砖,这一切都很好,但直到我想将这些瓷砖拼接回最终的 jpeg 图像。
我正在寻找可以执行以下操作的内置 sdk api 或免费软件解决方案:

  • 打开jpeg输出文件作为输出流
  • 将 RGB 像素从位图(图 block 1)流式传输到 jpeg 输出流
  • 将 RGB 像素从位图(图 block 2)流式传输到 jpeg 输出流
  • 等..对于所有的瓷砖
  • 关闭jpeg输出流
  • 除了编写我自己的 jpeg 编码器之外,还有什么想法或建议吗?

    最佳答案

    这个怎么样:

    FileOutputStream outFile = new FileOutputStream(output_file);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outFile);
    outFile.flush();
    outFile.close();
    

    您可以调整质量设置 (100)。查看docs

    您仍然需要决定如何对其进行切片。但是,如果您是在设备上拍摄图像,如果一开始没有引起内存问题,为什么加载整个图像会出现问题?

    将 Tiles 重新拼接在一起:这是我知道有效的 slippy maps 使用的一种简单方法。

    1. 以标准尺寸(比如 256x256)切割瓷砖
    2. 为每个图 block 分配一个 x,y 值 - 这可以是目录结构或文件名约定:即“0_0.jpg”
    3. 图 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/

    相关文章:

    android - 如何防止滚动到聚焦的 EditText

    java - Android 通知生成器 setSmallIcon()

    ios - 从照片库中裁剪 UIImage 与 iPhone 相机

    command-line - 使用 imagemagick 将 JPG 图像从灰度转换为 RGB

    java - JPEG 到 JFIF 转换

    android - JPEG 图像在多个设备上具有不同的像素值

    java - 从 kotlin Activity 调用 java 类

    android studio 在库模块而不是应用程序模块中导入.aar

    c# - 从图像中读取字符

    image-manipulation - Kohana [ fatal error ] : Class 'Image' not found