为什么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(hjpegSHAREDsrc/main/cpp/native-lib.cpp )#include 这个目录下所有的文件
include_directories(src/main/cpp/include)#导入jpeg动态库 SHARED;静态库为STATIC
add_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.hjpegjpeg#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值 存入datatempData = data;for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {color = *((int *) pixelColor);//获取对应的r,g,b值,其中a为高8位  color >> 24r = ((color & 0x00FF0000) >> 16);//r为次高8位  color >> 16g = ((color & 0x0000FF00) >> 8); //g为中8位  color >> 8b = 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

[JNI]开发实例(1)封装libjpeg库 保证图片质量压缩图片相关推荐

  1. AndroidStudio Jni开发-生成多个so库

    jni开发-生成多个so库 本文介绍如何使用CMakeLists生成多个so,依赖多个第三方so库. 生成多个so库 添加要生成的so. 如上图要生成两个名为:libpciesdf.so.libpci ...

  2. AndroidStudio jni开发入门及打包so库和jar包

    AndroidStudio jni开发入门及打包so库和jar包 配置ndk开发环境 下载NDK,LLDB,CMake工具包 配置系统环境变量 在原有项目中进行jni开发环境配置 Androidstu ...

  3. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为"交叉编译"? 先看什么是 JNI?JNI 的全称就是 Java ...

  4. Linux环境下NDK JNI开发实例

    今天搞了一天这个实例,也不是那么的容易,中间碰到很多的问题 一,在windows下创建Test JNI工程 步骤: 1,在Eclipse中创建Android工程...(省略) 2,添加一个简单的功能, ...

  5. Android开发实例-自动生成题库的数独

    本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目实现自定义View用于绘制数独盘数据库的基本操作 看着市场上千篇一律的数独应 ...

  6. linux交叉编译jpeg,libjpeg的交叉编译以及jpeg图片的缩放(缩略图)

    libjpeg库的交叉编译 libjpeg库主要用于jpeg格式图片的编解码,其交叉编译过程如下 1.  下载源码 从官方网站http://www.ijg.org/files/ 下载libjpeg库的 ...

  7. angular模块库开发实例

    angular模块库开发实例 随着前端框架的诞生,也会随之出现一些组件库,方便日常业务开发.今天就聊聊angular4组件库开发流程. 下图是button组件的基础文件. nk-button.comp ...

  8. Android Studio1.4.x JNI开发基础 - 简单实例

    接上一篇,搭建好基于Android Studio的环境之后,编写native代码相对来说也比较简单了.在Android上编写Native代码和在Linux编写C/C++代码还是有区别,Native代码 ...

  9. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

  10. Android直播开发之旅(15):libjpeg库的编译移植与使用

    1. libjpeg介绍  libJPEG库是一款功能强大的JPEG图像处理开源库,它支持将图像数据压缩编码为JPEG格式和对原有的JPEG图像解压缩,Android系统底层处理图片压缩就是用得lib ...

最新文章

  1. 条令考试小程序辅助器_在线考试题库小程序开发有哪些功能?
  2. sql server:alter database name
  3. 三层架构和MVC模式
  4. 鸟哥的Linux私房菜(服务器)- 主机基本安全之一:限制 Linux 对外连线的端口
  5. Scala程序将字符串转换为整数
  6. js在wap端获取定位_iPhone 定位服务,没用的都关掉
  7. 27 FI配置-财务会计-外币评估-定义评估方范围
  8. Java多线程:线程停止
  9. c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt
  10. c++ post请求_Golang GinWeb框架5绑定请求字符串/URI/请求头/复选框/表单类型
  11. linux中文输入法 ibus
  12. centos 搭建nfs服务器
  13. 主题模型LDA理解与应用
  14. 什么软件测试充电器快不快,手机充电的快慢到底取决于什么?充电头还是数据线?看完就知道了...
  15. 小程序实现分享朋友圈
  16. TCP协议从入门到精通
  17. 《程序员修炼之道》读书笔记(二)--第三周
  18. 桌面提醒 android,如何让手机桌面上显示便签提醒事项?
  19. 百度知道推出企业问答平台
  20. 如何让邮件的收发行为真正有效

热门文章

  1. 全图中第K小路径/团问题(有向/无向)
  2. ++递归 字符串全排列_Ann全排列的枚举_递归实现(基于Python)
  3. 实部和虚部高斯变量瑞利衰落matlab,瑞利衰落信道的matlab仿真.doc
  4. spy 控件没有名字_PyQt5学习笔记(十一)高级容器控件
  5. Redis 和 memcached 区别
  6. SpringMVC中的返回值问题之三返回list类型和map类型
  7. 【日常学习】【二叉树遍历】Uva548 - Tree题解
  8. idea 根据数据库表自动创建持久化类
  9. jQuery对象和DOM对象的区别
  10. 数组及引用类型内存分配