[JNI]开发实例(1)封装libjpeg库 保证图片质量压缩图片
来源:互联网 发布:淘宝能买汽车吗 编辑:程序博客网 时间:2024/04/27 16:56
为什么libjpeg这么好用,这里不做介绍了,自行去搜索很多blog有介绍,也可以反编译微信,淘宝等大厂app,你都会发现libjpeg.so的身影。
直接上代码撸
环境:
android studio 2.2.3
下载编译好的libjpeg.so
当然你也可以下载libjpeg.a静态文件,然后把你的jni与这个.a打成一个so库;
这里为了方便就直接下载github上编译好的so文件了,你也可以尝试自己编译libjpeg.so
https://github.com/libjpeg-turbo/libjpeg-turbo
接下来就该创建ndk工程了,如果你看过前面几篇文章,创建工程应该不是问题。
配置cmakeList.xml
cmake_minimum_required(VERSION 3.4.1)add_library( hjpeg SHARED src/main/cpp/native-lib.cpp )#include 这个目录下所有的文件include_directories(src/main/cpp/include)#导入jpeg动态库 SHARED;静态库为STATICadd_library(jpeg SHARED IMPORTED )#对应so目录 这里为了方便写死的路径,只编译armeabi-v7a包set_target_properties(jpeg PROPERTIES IMPORTED_LOCATION ../../../../libs/armeabi-v7a/libjpeg.so)find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK library that # you want CMake to locate. log )target_link_libraries( # Specifies the target library. hjpeg jpeg #jnigraphics这个是android下面的bitmap.h对应的库 jnigraphics ${log-lib})
gradle配置:
只编译armeabi-v7a包
ndk { abiFilters 'armeabi-v7a' }
拷贝.h文件到cpp目录下
只用到这几个h文件,你可以去github下载下来的文件夹找出这些文件,也可以从我demo中拷贝过去。
准备工作就做完了,接下来开始编码
java 层创建一个ImageUtils.java
public class ImageUtils { static { System.loadLibrary("hjpeg");//对应cmakelist中配置的名称 } public static native boolean compressBitmap(Bitmap bitmap, int width, int height, String filePath,int quality);}
编写cpp文件:
Java_com_honjane_compress_utils_ImageUtils_compressBitmap(JNIEnv *env, jclass jcls, jobject bitmap, jint width, jint height, jstring jfilepath, jint quality) { AndroidBitmapInfo infoColor; BYTE *pixelColor; BYTE *data; BYTE *tempData; const char *filepath = env->GetStringUTFChars(jfilepath, 0); LOGE("------ 文件目录 %s", filepath); if ((AndroidBitmap_getInfo(env, bitmap, &infoColor)) < 0) { LOGE("parse error"); env->ReleaseStringUTFChars(jfilepath, filepath); return false; } //锁住 与操作canvas类似,操作前先锁住 if ((AndroidBitmap_lockPixels(env, bitmap, (void **) &pixelColor)) < 0) { LOGE("lock pixels error"); env->ReleaseStringUTFChars(jfilepath, filepath); return false; } BYTE r, g, b; int color; data = (BYTE *) malloc(width * height * 3); //获取bitmap对应的rgb值 存入data tempData = data; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { color = *((int *) pixelColor); //获取对应的r,g,b值,其中a为高8位 color >> 24 r = ((color & 0x00FF0000) >> 16);//r为次高8位 color >> 16 g = ((color & 0x0000FF00) >> 8); //g为中8位 color >> 8 b = color & 0X000000FF; //b为低8位 *data = b; *(data + 1) = g; *(data + 2) = r; data += 3; pixelColor += 4; } } //释放锁 AndroidBitmap_unlockPixels(env, bitmap); int resultCode = generateJPEG(tempData, width, height, quality, filepath, true); LOGE("------压缩完成 0 失败 ,1 成功 resultCode= %d", resultCode); free(tempData); if (resultCode == 0) { env->ReleaseStringUTFChars(jfilepath, filepath); return false; } env->ReleaseStringUTFChars(jfilepath, filepath); return true;}
主要有这几个步骤:
1、将bitmap解码并转换为RGB数据
2、为JPEG对象分配空间并初始化
3、获取文件信息
4、指定压缩数据源
5、为压缩设定参数,包括图像大小,颜色空间
6、开始压缩
7、压缩完毕
8、释放资源
代码中在对应位置有做注释,请对照代码阅读。
效果:
代码地址:
https://github.com/honjane/android-libjpeg
1 0
- [JNI]开发实例(1)封装libjpeg库 保证图片质量压缩图片
- Android LibJpeg图片压缩
- Android进阶——图片优化之质量压缩、尺寸压缩、采样率压缩、LibJpeg压缩
- Android_NDK图片压缩之Libjpeg库使用
- Android压缩图片和libjpeg库
- Android压缩图片和libjpeg库
- libjpeg哈夫曼算法压缩图片
- 关于libjpeg修改图片质量的讨论
- 关于libjpeg修改图片质量的讨论
- 图片等质量压缩
- JAVA图片压缩质量
- 图片质量压缩笔记
- Android图片质量压缩
- android图片压缩 质量压缩 像素压缩 github压缩库
- 使用libjpeg库将bmp图片压缩成jpg
- Android图片压缩库——libjpeg-turbo
- Android图片压缩库——libjpeg-turbo
- 压缩图片的方法(压缩图片的质量)
- SEO唯有勤奋优化,新手必读!
- Python操作HBase
- Activity生命周期
- 乐观锁和悲观锁的区别
- iOS学习笔记-038.UITableView示例二——九宫格
- [JNI]开发实例(1)封装libjpeg库 保证图片质量压缩图片
- 论文Convolutional Naural Networks for Sentence Classification--模型介绍篇
- 非微信官方网页,继续访问将转换成手机预览模式
- 蛇行矩阵
- 区间更新POJ3468 HDU1698
- JS获取表单数据
- 阅读Object类源码
- Python基础语法(4)——GUI编程及猜数字游戏
- 2017.3.4 wyd测试