2015-09-23 70 views
1

正在使用的libjpeg渦輪從here壓縮使用JPEG壓縮的圖像,因爲的libjpeg渦輪機器人JPEG壓縮

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

在我的Android項目中導致大圖像的OOM。

以前我使用libjpeg-turbo從here,這導致了我很多麻煩,所以我轉移到sorccu上面的Github(我相信這是最新的或工作良好的庫)。

Android的工作室 - 1.4 RC1 的Android NDK - r10e Android SDK中分鐘= 14,編譯= 22

還與本傑明代碼與老搖籃1.3.0我試圖造成不少誤區,幾個星期後,嘗試我更改爲gradle-experimental:0.2.0和一切編譯良好。

因爲我覺得sorccu Github易於集成和使用,轉向它。然後在庫中使用turbojpeg-jni.c以及用於在android中集成的java代碼(兩者均可在庫中使用)。

我能夠使用ndk-build進行集成和編譯來構建.so文件並將其複製到lib文件夾並且能夠在java代碼中使用它。在Java中android.mk = jpegturbo

的gradle中

模塊名稱= jpegturbo 模塊名稱內置它作爲共享庫

庫加載代碼=的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)); 

可能是在上述區塊的方法或邏輯可能是錯的,幫幫我!

  • 我沒有改變從github查看application.mk,
  • APP_ABI:= armeabi armeabi-V7A armeabi-V7A硬arm64-V8A 86 x86_64的

    我用下面的命令來構建.so文件

    NDK建造NDK_PROJECT_PATH =。 APP_BUILD_SCRIPT =/Android.mk APP_ABI = armeabi-V7A LOCAL_ARM_NEON =真ARCH_ARM_HAVE_NEON =真

    它生成ABI armeabi-V7A .so文件獨自一人,我手動複製其他ABI的the.so文件。我甚至試過下面的命令,但它不幫助

    ndk-build NDK_PROJECT_PATH =。 APP_BUILD_SCRIPT = /機器人。mk APP_ABI =全部

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

    而且最終的apk的作品在我的手機索尼XPERIAüST25i,但不是在模擬器它說的.so文件無法找到,我沒有在其他設備中

    檢查

    注: - 我可能是錯的庫的作者,但提到庫創建者都已經做了很多工作

    我還提到了以下鏈接,

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

    更新 解決問題2,通過改變Application.mk爲 APP_ABI:= armeabi-V7A armeabi-V7A硬86 x86_64的arm64-V8A APP_PLATFORM:= android- 14

    這裏是我的NDK-build命令 NDK建造NDK_PROJECT_PATH =。 APP_BUILD_SCRIPT =/Android.mk NDK_APPLICATION_MK =/Application.mk

    這個程序後工作在模擬器也沒關係

    回答

    0

    最後我做到了工作,用this question

    感謝幫助用戶誰發佈它。

    該代碼完全符合我的要求,並且能夠壓縮圖像。

    注:但問題壓縮大圖像(> 5-30 MB)

    更新: -

    問題壓縮大圖像(> 5-30 MB)可以通過指定來解決將尺寸調整爲原始寬度和高度的1/8(最小值)。

    +0

    嗨Balamurugan,只是一個簡單的問題。我遇到了Android的默認jpeg壓縮問題,它會創建工件,請參閱此問題以獲取更多詳細信息:http://stackoverflow.com/questions/36487971/how-to-compress-bitmap-as-jpeg-with-least -quality-loss-on-android我想問問libjpeg-turbo是否能夠解決這個問題? –

    +0

    那麼這個問題需要更深入挖掘Bitmap.compress,我沒有那麼多的曝光,更好的你可以試試libjpeg-turbo,記得libjpeg-turbo不是libjpeg的精確副本,它有它的自己定製。 – Balamurugan