性能优化---图片优化(4)

相关资料下载

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;
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。