libjpeg турбо андроид сжатие jpeg

Здесь я использую libjpeg-turbo для сжатия изображений с использованием сжатия JPEG, так как

Bitmap.compress (Bitmap.CompressFormat.JPEG, качество, ByteArrayOutputStream);

вызывает OOM для больших изображений в моем проекте Android.

Раньше я использовал libjpeg-turbo, что доставляло мне много хлопот, поэтому я перешел на Github с помощью команды sorccu (я полагаю, это была последняя или работавшая библиотека).

Android Studio - 1.4 RC1 Android Ndk - r10e Android SDK min = 14, скомпилировано = 22

Также с кодом Бенджамина я пытался использовать старую версию Gradle 1.3.0, которая вызывала много ошибок, после нескольких недель попыток я перешел на gradle-экспериментальный: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. Основная проблема: я не могу сжать изображение, используя его, сжатое изображение повреждено, может быть, я делаю это неправильно, ниже приведен код 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. я не изменил application.mk из github,

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

он генерирует файл.so только для ABI armeabi-v7a, я вручную копирую файл.so для других ABI. я даже попробовал ниже команды, но это не помогает

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

Обновление решило проблему 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

После этого приложение работает нормально в эмуляторе тоже

1 ответ

Решение

В конце концов я сделал это с помощью этого вопроса

Спасибо пользователю, который это опубликовал.

Код точно соответствует моим требованиям и способен сжимать изображения.

Примечание: но проблема для сжатия больших изображений (> 5-30 МБ)

ОБНОВИТЬ:-

Проблему сжатия больших изображений (> 5-30 МБ) можно решить, указав размеры для изменения размера как 1/8 от его первоначальной ширины и высоты (минимум).

Другие вопросы по тегам