java - libjpeg turbo android jpeg 压缩

标签 java android c android-ndk libjpeg-turbo

我正在使用来自 here 的 libjpeg-turbo使用 JPEG 压缩来压缩图像,因为

Bitmap.compress(Bitmap.CompressFormat.JPEG, 质量, ByteArrayOutputStream);

导致我的 Android 项目中的大图像 OOM。

之前我使用的是来自 here 的 libjpeg-turbo这给我带来了很多麻烦,所以我通过 sorccu 转移到了上面的 Github(我相信这是最新的或者工作正常的库)。

Android Studio - 1.4 RC1 Android Ndk-r10e Android SDK 最小 = 14,编译 = 22

还有 Benjamin 代码,我尝试使用旧的 Gradle 1.3.0,这导致了很多错误,经过几周的尝试,我更改为 gradle-experimental:0.2.0 并且一切都编译好了。

由于感觉sorccu Github易于集成和使用,所以转向了它。然后使用库中的 turbojpeg-jni.c 以及用于在 android 中集成的 java 代码(都在库中可用)。

我能够使用 ndk-build 进行集成和编译以构建 .so 文件并复制到 lib 文件夹并能够在 java 代码中使用它。

gradle 中的模块名称 = jpegturbo android.mk 中的模块名称 = jpegturbo

将其构建为共享库

java 中的库加载代码 = System.loadLibrary("jpegturbo"); (org.libjpegturbo.turbojpeg.TJLoader.java)

我现在遇到的问题很少,请帮我解决一下,

1.主要问题我无法使用它来压缩图像,压缩图像已损坏可能是我做错了,下面是java代码

static {
    try {
        tj = new TJCompressor();
    } catch (Exception e) {
        e.printStackTrace();
    }
 }

File file = new File(pathName);
int actualBytes = (int) file.length();

byte[] srcBuf = new byte[actualBytes];
byte[] dstBuf;

FileInputStream fIn;
try {
    fIn = new FileInputStream(file);
    fIn.read(srcBuf);
    fIn.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

tj.setSourceImage(srcBuf, 0, 0, options.outWidth, 0, options.outHeight, TJ.PF_RGB);
tj.setJPEGQuality(quality);
tj.setSubsamp(TJ.SAMP_444);
dstBuf =  tj.compress(TJ.FLAG_ACCURATEDCT, options.outWidth, options.outHeight);

int size = tj.getCompressedSize();

tj.close();

FileOutputStream fos;
   try {
       fos = new FileOutputStream(file1);
       fos.write(dstBuf);
       fos.close();
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }catch (OutOfMemoryError e) {
       e.printStackTrace();
   }

Log.e("SIZE ", String.valueOf(size));

可能是上述 block 中的方法或逻辑可能是错误的,帮帮我!!!

  1. 我没有更改 github 上的 application.mk,

APP_ABI := armeabi armeabi-v7a armeabi-v7a-hard arm64-v8a x86 x86_64

我使用下面的命令来构建.so文件

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi-v7a LOCAL_ARM_NEON=true ARCH_ARM_HAVE_NEON=true

它单独为 ABI armeabi-v7a 生成 .so 文件,我手动复制其他 ABI 的 .so 文件。我什至尝试了以下命令,但没有帮助

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=all

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk

最终的 apk 在我的手机 Sony Xperia U ST25i 中也能正常工作,但在模拟器中却不行,它说找不到 .so 文件,我没有检查其他设备

注意: - 我对图书馆作者的看法可能是错误的,但是提到的图书馆创建者都做得很好

我还提到了以下链接,

  1. link 1
  2. link 2
  3. link 3

更新 解决了问题 2,通过将 Application.mk 更改为 APP_ABI := armeabi-v7a armeabi-v7a-hard x86 x86_64 arm64-v8a APP_PLATFORM := android-14

这是我的 ndk-build 命令 ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk

此应用程序在模拟器中也能正常运行

最佳答案

this question 的帮助下,我终于成功了

感谢发布它的用户。

代码完全符合我的要求,可以压缩图片。

注意:但是压缩大图像(> 5-30 MB)的问题

更新:-

压缩大图像(> 5-30 MB)的问题可以通过将调整尺寸指定为其原始宽度和高度的 1/8(最小值)来解决。

关于java - libjpeg turbo android jpeg 压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32735374/

相关文章:

android - 从其他 View 的位置动画/平移 View

c++ - 对于基于指针和数组的字符串初始化,strlen 和 sizeof 的不同答案

NULL和整数之间的C类型转换

java - 这个符号在 IntelliJ 中是什么意思? (文件名左下角红圈,里面有 'J')

java - Java字节码中 "GOTO"后面的数字是什么?

android - 我怎样才能从选定的标记中获取信息? (安卓)

CMake 配置

java - Hibernate persist() 与 save() 方法

java - 获取远程地址的 Repository 对象

javascript - 检测全屏更改在某些 Android 设备上不起作用