libjpeg turbo android jpeg 压缩
libjpeg turbo android jpeg compression
我正在使用来自 here 的 libjpeg-turbo 来使用 JPEG 压缩来压缩图像,因为
Bitmap.compress(Bitmap.CompressFormat.JPEG, 质量, ByteArrayOutputStream);
导致我的 Android 项目中的大图像 OOM。
以前我使用的是 here 的 libjpeg-turbo,这给我带来了很多麻烦,所以我转向上面的 Github by sorccu(我相信这是最新的或者工作正常的库) .
Android Studio - 1.4 RC1
Android Ndk - r10e
Android SDK 最小 = 14,编译 = 22
还有本杰明代码,我尝试使用旧的 Gradle 1.3.0,这导致了很多错误,经过几周的尝试,我改为 gradle-experimental:0.2 .0 一切都编译好了。
因为觉得sorccu Github 易于集成和使用,所以转向了它。然后使用库中的 turbojpeg-jni.c 以及 java 代码集成到 android 中(两者都在库中可用)。
我能够使用 ndk-build 进行集成和编译以构建 .so 文件并复制到 lib 文件夹并能够在 java 代码中使用它。
gradle 中的模块名称 = jpegturbo
android.mk = jpegturbo
中的模块名称
将其构建为共享库
库加载代码在java = System.loadLibrary("jpegturbo"); (org.libjpegturbo.turbojpeg.TJLoader.java)
我现在遇到的问题很少,请帮我解决一下,
1.The 主要问题我无法使用它压缩图像,压缩图像已损坏可能是我做错了,下面是 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中的方法或逻辑有误,帮帮我!!!
- 我没有从 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 手动复制 the.so 文件。我什至尝试了以下命令,但没有帮助
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=全部
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
最后的 apk 在我的手机 Sony Xperia U ST25i 上也能用,但在模拟器上不行,它说找不到 .so 文件,我没有检查其他设备
注意:
- 我对库作者的看法可能是错误的,但是提到的两个库创建者都做得很好
我还参考了以下链接,
- link 1
- link 2
- link 3
更新
通过将 Application.mk 更改为解决了问题 2
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(最小值)来解决。
我正在使用来自 here 的 libjpeg-turbo 来使用 JPEG 压缩来压缩图像,因为
Bitmap.compress(Bitmap.CompressFormat.JPEG, 质量, ByteArrayOutputStream);
导致我的 Android 项目中的大图像 OOM。
以前我使用的是 here 的 libjpeg-turbo,这给我带来了很多麻烦,所以我转向上面的 Github by sorccu(我相信这是最新的或者工作正常的库) .
Android Studio - 1.4 RC1 Android Ndk - r10e Android SDK 最小 = 14,编译 = 22
还有本杰明代码,我尝试使用旧的 Gradle 1.3.0,这导致了很多错误,经过几周的尝试,我改为 gradle-experimental:0.2 .0 一切都编译好了。
因为觉得sorccu Github 易于集成和使用,所以转向了它。然后使用库中的 turbojpeg-jni.c 以及 java 代码集成到 android 中(两者都在库中可用)。
我能够使用 ndk-build 进行集成和编译以构建 .so 文件并复制到 lib 文件夹并能够在 java 代码中使用它。
gradle 中的模块名称 = jpegturbo android.mk = jpegturbo
中的模块名称将其构建为共享库
库加载代码在java = System.loadLibrary("jpegturbo"); (org.libjpegturbo.turbojpeg.TJLoader.java)
我现在遇到的问题很少,请帮我解决一下,
1.The 主要问题我无法使用它压缩图像,压缩图像已损坏可能是我做错了,下面是 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中的方法或逻辑有误,帮帮我!!!
- 我没有从 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 手动复制 the.so 文件。我什至尝试了以下命令,但没有帮助
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=全部
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
最后的 apk 在我的手机 Sony Xperia U ST25i 上也能用,但在模拟器上不行,它说找不到 .so 文件,我没有检查其他设备
注意: - 我对库作者的看法可能是错误的,但是提到的两个库创建者都做得很好
我还参考了以下链接,
- link 1
- link 2
- link 3
更新 通过将 Application.mk 更改为解决了问题 2 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(最小值)来解决。