性能优化01 - 图片压缩 (NDK 哈夫曼算法压缩)_mac libjpeg压缩-程序员宅基地

技术标签: NDK  

libjpeg-turbo | Main / libjpeg-turbo

libjpeg编译文档
libjpeg-turbo/BUILDING· GitHub
Mac环境编译 libjpeg压缩库
cmake version 3.5.2
针对的arm-v7完整的编译脚本

#!/bin/bash

# Set these variables to suit your needs
NDK_PATH=/Users/dsh/Downloads/android/NDK/android-ndk-r17c
TOOLCHAIN=gcc
ANDROID_VERSION=21

# cd {build_directory}
cmake -G"Unix Makefiles" \
  -DANDROID_ABI=armeabi-v7a \
  -DANDROID_ARM_MODE=arm \
  -DANDROID_PLATFORM=android-${ANDROID_VERSION} \
  -DANDROID_TOOLCHAIN=${TOOLCHAIN} \
  -DCMAKE_ASM_FLAGS="--target=arm-linux-androideabi${ANDROID_VERSION}" \
  -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
# [additional CMake flags] {source_directory}
make

编译完成以后 需要在libjpeg-turbo-2.0.4 文件夹下找到以下文件
1、 需要用到的头文件
turbojpeg.h
jpeglib.h
jmorecfg.h
jerror.h
jconfig.h

2、编译完成的静态库
libturbojpeg.a

编写代码

    const char *path = env->GetStringUTFChars(path_, 0);


    //从bitmap获取argb数据
    AndroidBitmapInfo info;//info=new 对象();
    //获取里面的信息
    AndroidBitmap_getInfo(env, bitmap, &info);
    //得到图片中的像素信息
    uint8_t *pixels;//uint8_t char    java   byte     *pixels可以当byte[]
    AndroidBitmap_lockPixels(env, bitmap, (void **) &pixels);
    //jpeg argb中去掉他的a ===>rgb
    int w = info.width;
    int h = info.height;
    int color;
    //开一块内存用来存入rgb信息
    uint8_t *data = (uint8_t *) malloc(w * h * 3);//data中可以存放图片的所有内容
    uint8_t *temp = data;
    uint8_t r, g, b;
    //循环取图片的每一个像素
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            color = *(int *) pixels;//0-3字节  color4 个字节  一个点
            //取出rgb
            r = (color >> 16) & 0xFF;//    #rrggbb  16  0000rr   8  00rrgg
            g = (color >> 8) & 0xFF;
            b = color & 0xFF;
            //存放,以前的主流格式jpeg    bgr
            *data = b;
            *(data + 1) = g;
            *(data + 2) = r;
            data += 3;
            //指针跳过4个字节
            pixels += 4;
        }
    }
    //把得到的新的图片的信息存入一个新文件 中
    write_JPEG_file(temp,w,h,q,path);

    AndroidBitmap_unlockPixels(env, bitmap);
    free(data);

    env->ReleaseStringUTFChars(path_, path);

理解哈夫曼算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EMNQFZTX-1580611679589)(:storage/83fcef4e-9744-4603-8b77-b6af6186e1c1/b5c83a8f.png)]

编写libjepg 压缩代码

void write_JPEG_file(uint8_t *data, int width, int height, jint quality, const char *path) {
    // 1、 创建jpeg压缩对象
    jpeg_compress_struct jpegStruct;
    jpeg_error_mgr errorMgr;
    jpegStruct.err = jpeg_std_error(&errorMgr);
    jpeg_create_compress(&jpegStruct);
    // 2、 指定存储文件
    FILE * file = fopen(path,"wb");
    jpeg_stdio_dest(&jpegStruct,file);
    // 3、 设置压缩参数
    jpegStruct.image_width = width;
    jpegStruct.image_height = height;
    jpegStruct.input_components = 3;
    jpegStruct.in_color_space = JCS_RGB;
    jpeg_set_defaults(&jpegStruct);
    jpegStruct.optimize_coding = true;
    jpeg_set_quality(&jpegStruct,quality,1);
    // 4、 开始压缩
    jpeg_start_compress(&jpegStruct,1);
    // 5、循环写入每一行数据
    int row_stride = width * 3;
    JSAMPROW row[1];
    while (jpegStruct.next_scanline < jpegStruct.image_height){
        uint8_t * pixels = data + jpegStruct.next_scanline;
        row[0] = pixels;
        jpeg_write_scanlines(&jpegStruct,row,1);
    }
    // 6、压缩完成
    jpeg_finish_compress(&jpegStruct);

    // 7、释放jpeg对象
    fclose(file);
    jpeg_destroy_compress(&jpegStruct);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dingshuhong_/article/details/104142186

智能推荐

王者荣耀最低战力查询接口_王者荣耀战力查询网址-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏15次。分享一个可以查王者荣耀苹果区战力的接口,数据每周一会更新接口地址 支持GET、POSThttps://gamehook.top/api/hero/select所需参数:auth_code 授权码(身份验证) f0845d444f04eb24 必传hero_name 英雄名称 支持模糊搜索 必传返回结构{“code”:0,“msg”:“查询成功”,“data”:{“id”:19,“hero_name”:“曜”,“hero_photo”:“https://gamehook.top//u_王者荣耀战力查询网址

计算机考博面试题,考博复试八大常见问题-程序员宅基地

文章浏览阅读583次。“考博复试八大常见问题”相信是准备参加医学考博的朋友比较关心的事情,为此,医学教育网小编整理内容如下:第 1 问:初试和复试哪个更重要?初试成绩是敲门砖,对最终是否被录取有一定的参考价值,但即使在初试中考出高分也是属于过去,导师还要结合复试成绩来作出最终决定(这个是显而易见的,不然还要复试干嘛)。换言之,初试成绩决定不了录取,对录取的影响有限,但是话又说回来,前提是你要有复试机会!第 2 问:自我..._计算机申博面试题

Maven异常处理 Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.-程序员宅基地

文章浏览阅读8.5k次。Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.在mvn install打包安装到本地仓库时 出现了这个错误 仔细查找 是因为单元测试没有通过 存在失败的断言 将断言调试成功 即可安装_caused by: org.apache.maven.plugin.mojofailureexception: there are test fail

TCP的三次握手(建立连接)和四次挥手(关闭连接)http://www.cnblogs.com/Jessy/p/3535612.html_net.ipv4.tcp_syncookies与性能 site:blog.csdn.net-程序员宅基地

文章浏览阅读626次。转自:http://www.cnblogs.com/Jessy/p/3535612.htmlTCP的三次握手(建立连接)和四次挥手(关闭连接)参照:http://course.ccniit.com/CSTD/Linux/reference/files/018.PDFhttp://hi.baidu.com/raycomer/item/944d23d9b502d13be3108_net.ipv4.tcp_syncookies与性能 site:blog.csdn.net

五月IDO第三弹,13个热门项目即将上线-程序员宅基地

文章浏览阅读645次。波卡生态正在逐渐发力。作者 | 秦晓峰 编辑 | 郝方舟出品 | Odaily星球日报(ID:o-daily)过去这周的市场,堪称魔幻。随着 SHIB 价格的冲高,PIG、Lion 等...

BATT入局,小程序成超级APP连接一切的枢纽-程序员宅基地

文章浏览阅读358次。小程序已经无所不在的侵入了我们的生活。刚刚诞生时,大家认为微信小程序不过是升级版的“服务号”,也有人把它看作“借尸还魂”的直达号或H5网页。随着微信小程序在我们生活中的作用越来越大,业界此前的诸多偏见..._batt防三方

随便推点

Linxu界面之如何使侧边栏自动隐藏?(Ubuntu)_如何隐藏ubuntu侧边栏-程序员宅基地

文章浏览阅读5.5k次。如果你装了ubuntu桌面版就会发现默认情况下桌面左边会有一个侧边栏,从中我们可以启动一些软件,但是这个侧边栏一直显示在桌面左边不是很美观,还会占据桌面的的空间。我们可以使其自动隐藏起来,当我们需要时只要把鼠标放到桌面左边它就会出现。1. 系统设置-外观打开系统设置,打开外观选项2. 点击&amp;amp;amp;amp;quot;行为&amp;amp;amp;amp;quot;标签3. 打开自动&amp;amp;amp;amp;quot;隐藏启动器&a_如何隐藏ubuntu侧边栏

JSP九大内置对象详解全析(三):session对象_session撖寡情-程序员宅基地

文章浏览阅读1.1w次,点赞11次,收藏68次。1、session对象概述 session对象是由服务器自动创建与用户请求相关的对象。服务器会为每一个用户创建一个session对象用来保存用户信息,跟踪用户操作。该对象内部使用Map类来保存数据,因此它的数据类型是key-value形式。对应javax.servlet.http.HttpSession.class对象。 服务器为不同的浏览器在内存中创建用于保存数据的对象叫seesio_session撖寡情

USB加密狗复制克隆软件_u盘加密狗复制克隆软件-程序员宅基地

文章浏览阅读3.2w次,点赞6次,收藏50次。前言: 加密狗复制技术现在已经很成熟了,如果您想把手上某一个USB加密狗复制一下,不妨先自己尝试一下复制,实在复制不了,可以请专业人士帮忙(比较知名的如COPYONE工作室)。今天软件小编已经帮大家找来了,就是这款USB加密狗克隆复制软件。下载地址:https://download.csdn.net/download/QQ528621124/19774921加密狗复制克隆其实说白了就是加密狗复制或者模拟,加密狗就像一个U盘一样,存储了特殊的加密串。加密狗是外形酷似U盘的一种硬..._u盘加密狗复制克隆软件

C语言数据结构-第六章、树和二叉树-电大同步进度_给出树的广义表形式怎样看度是多少-程序员宅基地

文章浏览阅读953次,点赞3次,收藏3次。第六章、树和二叉树——内容简介线性结构中结点间具有惟一前驱、惟一后继关系,而非线性结构中结点间前驱、后继的关系并不具有惟一性。其中,在树型结构中结点间关系是前驱惟一而后继不惟一,即结点之间是一对多的关系;直观地看,树结构是指具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。树和图的理论基础属离散数学内容,数据结构讨论的重点在树和图结构的实现技术。本章主要讨论树结构的特性、存储及其操作的实现。第1讲树的基本概念——内容简介本节主要介绍:树的基本概念树相关的术语_给出树的广义表形式怎样看度是多少

计算机单片机考试作弊检讨书,作弊检讨书500字范文(8页)-原创力文档-程序员宅基地

文章浏览阅读176次。作弊检讨书500字范文作弊实在不是一件明智之举的事,犯了作弊这个错误,该怎么写检讨呢?下面为大家精心了作弊检讨书500字范文,仅供参考。亲爱的班主任:我是高二14班的一名普通学生,写这封检讨书反省我在这次期中考试中作弊的错误。我怀着十万分的愧疚和十万分的难过给你写下这封检讨书:关于此次期中考试,我完全是因为平时上课的不认真,老师布置的作业没有按时完成,因为对于这次考试没有十足的把握,又怕考不好被父..._单片机考试发草稿纸

Java调用 新浪微博API 接口发微博,逐项讲解,绝对清晰_微博开发平台 发送微博 java-程序员宅基地

文章浏览阅读1.5w次,点赞7次,收藏24次。转载自:http://www.myexception.cn/program/1930025.htmlJava调用 新浪微博API 接口发微博,逐条讲解,绝对清晰最近要做个课程设计,使用微博控制树莓派,树莓派再控制发光二极管的亮和灭,主要设计分两层,上层是用Java调用新浪微博API来实现对微博旳监听,当我的微博被回复时能够自动读取评论内容,并根据评论的指令内容来决定树莓派的控制动作_微博开发平台 发送微博 java

推荐文章

热门文章

相关标签