繁体   English   中英

libjpeg涡轮android jpeg压缩

[英]libjpeg turbo android jpeg compression

我从这里开始使用libjpeg-turbo来使用JPEG压缩来压缩图像,因为

Bitmap.compress(Bitmap.CompressFormat.JPEG,quality,ByteArrayOutputStream);

导致我的Android项目中的大图片出现OOM。

以前我从这里使用libjpeg-turbo,这给我带来了很多麻烦,所以我通过sorccu转到了上述Github(我相信这是最新的或可以正常使用的库)。

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以及用于在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));

可能是以上代码块中的方法或逻辑可能是错误的,请帮助我!

  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 =全部

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

最终的apk也可以在我的移动版Sony Xperia U ST25i中使用,但是在模拟器中却无法显示。so文件无法找到,我没有在其他设备中签入

注意:-我对图书馆作者可能是错的,但上述提到的图书馆作者都做得很好

我还提到了以下链接,

  1. 链接1
  2. 连结2
  3. 连结3

更新通过将Application.mk更改为APP_ABI解决了问题2:= 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

这个应用程序在模拟器中也可以正常工作后

终于,在这个问题的帮助下, 它成功了

感谢发布它的用户。

该代码完全符合我的要求,并且能够压缩图像。

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

更新: -

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM