簡體   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