【问题标题】:How to create a progressive JPEG image on Android如何在 Android 上创建渐进式 JPEG 图像
【发布时间】:2012-06-11 08:52:27
【问题描述】:

我需要通过 非常 低带宽连接从 Android 手机(低至 10kByte/s)发送图像,并希望以渐进(隔行)模式发送图像,以便用户在在漫长的传输过程中,另一端已经开始看到图像。现在,我正在使用常规照片应用程序创建图像:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

但这会创建非渐进式照片,我无法发现如何说服它这样做。我探索的第二个选项(读取并重新压缩拍摄的图像)被挫败了,因为据我所知,Bitmap 的 compress 方法除了格式名称和压缩因子之外不允许任何编码参数:

bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);

我首选的解决方案是指示照片应用以渐进模式保存。

下一个最佳选择是一种 Java 算法,它可以无损地将存储的 jpeg 转换为渐进式(jpegtran 在 Linux 上执行此操作,但它使用 C 语言并依赖于 libjepeg)。

下一个最好的方法是为 android 指定相关的编码参数,允许我重新压缩它,或者使用一个替代的 Java 库来做同样的事情。

进一步的研究表明,算法已经存在 (/system/lib/libjpeg.so),源代码在 ~/android-sdk-linux/source-tree/external/jpeg 中——但似乎没有现成的 JNI 包装器可用。

【问题讨论】:

  • 请注意:“渐进式”正是您所得到的:从上到下。您正在寻找的内容称为“隔行扫描”。 JPEG 输出格式不支持隔行扫描。 PNG 可以,因此您需要考虑创建隔行扫描的 PNG 图像。
  • @AleksG 对不起,但我不同意。请查看wikipedia 部分“JPEG 压缩”。正如我在问题中提到的,这种格式很容易使用 jpegtran 在“Linux”上创建。
  • 目前在 Android 中编码渐进式 JPEG 的情况如何?

标签: java android jpeg


【解决方案1】:

你看过这份文件吗?

http://docs.oracle.com/javase/6/docs/api/javax/imageio/plugins/jpeg/JPEGImageWriteParam.html

好像有写渐进式支持。

或者,您可以使用例如OpenJPEG 通过 JNI。请参阅http://www.linux-mag.com/id/7697/ 作为开始。

【讨论】:

  • 感谢您的建议,但我需要 Android 中的解决方案,并且那里没有 JPEGImageWriteParam。直接使用 libjpeg (Openjpeg) 我只是没有机会继续工作。
  • 我明白了。但是JDK源是可用的,也许你可以重用那个/那些源类?
  • 它们是可用的,我已经尝试过了——但如果你试图把这个功能拉过来,你会拉几十个类和 ti。 Android 不支持这方面的大部分包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2017-01-03
  • 2013-03-13
  • 2017-09-23
相关资源
最近更新 更多