相关资料下载
ndk
https://developer.android.google.cn/ndk/index.html
https://developer.android.com/ndk/downloads/
Android Native Development Kit一套允许使用原生代码语言C/C++,实现部分应用的工具集。 C/C++与Java通过JNI交互;
LibJpeg库
https://libjpeg-turbo.org/
使用前的准备:
1、建议使用release版本
2、下载路径 wget https://github.com/libjpeg-turbo/libjpeg-turbo/archive/2.0.2.tar.gz
3、解压 tar xvf 2.0.2.tar.gz
4、编译 https://github.com/libjpeg-turbo/libjpeg-turbo/blob/master/BUILDING.md
5、安装NASM或YASM :
5.1、下载路径 https://www.nasm.us/pub/nasm/releasebuilds/
5.2、选择最新的发布版本(目前是2.14/)
下载压缩包 wget https://www.nasm.us/pub/nasm/releasebuilds/2.14/nasm-2.14.tar.gz
解压 tar xvf nasm-2.14.tar.gz
进入解压后的目录可以看到一个文件configure 用于生成Makefile文件
编译出该文件 ./configure
6、接下来可以进入libjepg目录进行编译了
6.1、cd libjpeg-turbo-2.0.2
6.2、安装cmake
删除原来的 apt-get autoremove cmake
https://cmake.org/download/
wget https://github.com/Kitware/CMake/releases/download/v3.14.3/cmake-3.14.3.tar.gz
tar zxvf cmake-3.14.3.tar.gz
./bootstarp
gmake
make install
cmake --version能看到版本号表示安装成功了
接下来进入到libjepg目录执行cmake -G"MSYS Makefiles"
6.3、生成shell脚本
vim build.sh新建一个文件
chmod +x build.sh
#!/bin/bash
# Set these variables to suit your needs
NDK_PATH=\..\android-ndk-r19c
TOOLCHAIN=gcc
ANDROID_VERSION=21
cmake -G"Unix Makefiles" \
-DANDROID_ABI=x86_64 \
-DANDROID_PLATFORM=android-${ANDROID_VERSION} \
-DANDROID_TOOLCHAIN=${TOOLCHAIN} \
-DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
make
CMakeList配置
Libjepg压缩步骤
1.获得待压缩Bitmap
2.获得Bitmap中像素数据(ARGB->BGR)
3.Libjpeg压缩
3.1、创建jpeg压缩对象
jpeg_compress_struct jcs;
//错误回调
jpeg_error_mgr error;
jcs.err = jpeg_std_error(&error);
//创建压缩对象
jpeg_create_compress(&jcs);
3.2、指定存储文件
FILE *f = fopen(path, "wb");
jpeg_stdio_dest(&jcs,f);
3.3、设置压缩参数
jcs.image_width = w;
jcs.image_height = h;
//bgr
jcs.input_components = 3;
jcs.in_color_space = JCS_RGB;
jpeg_set_defaults(&jcs);
//开启哈弗曼功能
jcs.optimize_coding = true;
jpeg_set_quality(&jcs, q, 1);
3.4、开始压缩
jpeg_start_compress(&jcs, 1);
3.5、循环写入每一行数据
int row_stride = w * 3; //一行的字节数
JSAMPROW row[1];
while (jcs.next_scanline < jcs.image_height) {
//取一行数据
uint8_t *pixels = data + jcs.next_scanline * row_stride;
row[0] = pixels;
jpeg_write_scanlines(&jcs, row, 1);
}
3.6、压缩完成
jpeg_finish_compress(&jcs);
3.7、释放jpeg对象
fclose(f);
jpeg_destroy_compress(&jcs);
Android 本身系统的Bitmap优化
public static Bitmap resizeBitmap(Context context , int id , int maxW , int maxH , boolean hasAlpha) {
Resources resources = context.getResources();
BitmapFactory.Options options = new BitmapFactory.Options();
//需要得到系统的处理信息, 比如解码出宽和高
options.inJustDecodeBounds = true;
//我们把原来的解码参数改了再去生成bitmap
BitmapFactory.decodeResource(resources , id , options);
//取得宽高
int w = options.outWidth;
int h = options.outHeight;
//设置缩放系数
options.inSampleSize = calcuteInSampleSize(w , h , maxW , maxH);
if (!hasAlpha) {
//不需要Alpha通道
options.inPreferredConfig = Bitmap.Config.RGB_565;
}
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(resources, id, options);
}
private static int calcuteInSampleSize(int w, int h, int maxW, int maxH) {
int inSampleSize = 1;
if (w > maxW && h > maxH) {
inSampleSize = 2;
do {
inSampleSize *= 2;
}while (w / inSampleSize > maxW && h / inSampleSize > maxH);
}
return inSampleSize/2;
}
}