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));
Может быть, подход или логика в вышеупомянутом блоке могут быть неправильными, помогите мне!!!
- я не изменил 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 не может быть найден, я не проверял другие устройства
Примечание: - я могу ошибаться в отношении автора библиотеки, но оба упомянутых создателя библиотеки проделали большую работу
я также сослался на следующие ссылки,
Обновление решило проблему 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 от его первоначальной ширины и высоты (минимум).