Pewarta Proxy

📋 Server Request & Proxy Logs

Loading active proxy settings...
Developed by Khairul Adha (adhexa.id)
Mengambil log server...

⚙️ Pengaturan Proxy Target

Android图片压缩,自己编译libjpeg

android cmake 打印_Android使用CMAKE编译libjpeg 本文主要介绍使用 CMAKE 编译 libjpeg-turbo 类库,本文相关代码请在GitHub-TurboJpegSample 查看。libjpeg-turbo 附GitHub 地址,libjpeg-turbo 是个运用极其广泛的库,可以说,基本上电脑上手机上能见到的 JPEG 压缩的地方用的一般都是 libjpeg-turbo,本文只介绍使用了图片压缩的功能。使用 Android 保存图片时... 阅读详情

之前的博客提到过关于图片压缩的方法: Android 图片压缩,Bitmap优化


基于此so库写的一个图片压缩框架:https://github.com/JavaNoober/Light


Android原生的压缩方法,不在乎两种:通过设置simpleSize根据图片尺寸压缩图片;通过Bitmap.compress方法通过压缩图片质量,去压缩。但是我们当我们对图片质量和图片文件大小同时存在要求时,我们发现无论怎么去设置参数,我们所做的效果总是不能尽如人意,而且同样大小的图片,效果却总是比iOS的效果差很多。

其实归根到底的是iOS和Android的压缩算法存在一些差异。

Android所用的是skia的压缩算法,它在google的很多地方,比如chrome、Android等都有使用,而Bitmap的压缩算法就是通过这个实现。而Skia是libjpeg进行了封装,google在实现skia时对其中一个地方进行了修改:通过哈夫曼算法来进行图片压缩,但是采用这个算法的时候,机器可能会出现性能问题,于是并没有调动这个方法。

boolean optimize_coding 
TRUE causes the compressor to compute optimal Huffman coding tables 
for the image. This requires an extra pass over the data and 
therefore costs a good deal of space and time. The default is 
FALSE, which tells the compressor to use the supplied or default 
Huffman tables. In most cases optimal tables save only a few percent 
of file size compared to the default tables. Note that when this is 
TRUE, you need not supply Huffman tables at all, and any you do 
supply will be overwritten.
但是,这个问题在十年前或许存在,但是现在的机器已经完全可以解决性能问题,而google却忘记了更正当年的代码。


接下来,我们就自己去编译生成libjpeg的动态库,然后调用。

github中android libjpeg的源文件地址:https://github.com/libjpeg-turbo/libjpeg-turbo

这个我们需要自己去编译,但是已经有人帮我们编译好了,压缩算法也已经实现,因此,我们去下载然后编译即可:https://github.com/bither/bither-android-lib


首先将上面下载好的已经编译好的libjpeg放到jni目录下,将下图内容都放到jni目录中:


安装好ndk以后,直接输入ndk-build即可。

接下来就会编译生成arm下的动态库,使用的时候必须在项目中新建一个包net.bither.util,然后加入下面这个类方法,也就是使用了libjpeg开启哈夫曼算法的压缩算法:

/*
 * Copyright 2014 http://Bither.net
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.bither.util;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;

public class NativeUtil {
	private static int DEFAULT_QUALITY = 95;

	public static void compressBitmap(Bitmap bit, String fileName,
			boolean optimize) {
		compressBitmap(bit, DEFAULT_QUALITY, fileName, optimize);

	}

	public static void compressBitmap(Bitmap bit, int quality, String fileName,
			boolean optimize) {
		Log.d("native", "compress of native");

		// if (bit.getConfig() != Config.ARGB_8888) {
		Bitmap result = null;

		result = Bitmap.createBitmap(bit.getWidth() / 3, bit.getHeight() / 3,
				Config.ARGB_8888);// 缩小3倍
		Canvas canvas = new Canvas(result);
		Rect rect = new Rect(0, 0, bit.getWidth(), bit.getHeight());// original
		rect = new Rect(0, 0, bit.getWidth() / 3, bit.getHeight() / 3);// 缩小3倍
		canvas.drawBitmap(bit, null, rect, null);
		saveBitmap(result, quality, fileName, optimize);
		result.recycle();
		// } else {
		// saveBitmap(bit, quality, fileName, optimize);
		// }

	}

	private static void saveBitmap(Bitmap bit, int quality, String fileName,
			boolean optimize) {

		compressBitmap(bit, bit.getWidth(), bit.getHeight(), quality,
				fileName.getBytes(), optimize);

	}

	private static native String compressBitmap(Bitmap bit, int w, int h,
			int quality, byte[] fileNameBytes, boolean optimize);

	static {
		System.loadLibrary("jpegbither");
		System.loadLibrary("bitherjni");

	}

}

注意包名和方法名都是不能变的,因为在编译的时候已经被确定。

如果我们想要去修改方法名放入自己的项目中怎么办。那我们就需要去修改一下bitherlibjni.c这个文件。

例如我想把这个方法放在com.example.test中的ImageUtils中,

我们只需要把c文件中的

jstring Java_net_bither_util_NativeUtil_compressBitmap(JNIEnv* env,
      jobject thiz, jobject bitmapcolor, int w, int h, int quality,
      jbyteArray fileNameStr, jboolean optimize) {
修改为

jstring Java_com_example_test_ImageUtils_compressBitmap(JNIEnv* env,
      jobject thiz, jobject bitmapcolor, int w, int h, int quality,
      jbyteArray fileNameStr, jboolean optimize) {
这个对会ndk开发的同学应该都知道,接下来我们重新运行ndk-build就可以重新替换so文件然后调用我们自己的libjpeg了。

但是,目前libjpeg是很多年前的了。github上这个库只支持arm架构的cpu,如果我们想用这个库的话,只能通过在加载so文件的时候对其进行trycatch处理,来防止x86等其他cpu架构的机器加载so文件报错。


压缩效果对比:

原图:



bitmap压缩:




libjpeg压缩:




github下载地址:https://github.com/xiaoqiAndroid/LibJpegCompress/tree/master

基于libjpeg库的Android高效图片压缩终极实战方案 JPEG作为一种广泛使用的图像压缩标准,其核心依赖于高效的编码与解码算法。libjpeg是实现JPEG压缩与解压缩的开源函数库,由Independent JPEG Group(IJG)开发并持续维护,具备高度可移植性和优异的性能表现。该库支持多种压缩参数配置,包括量化表、采样率、颜色空间转换等,适用于对图像质量与文件大小有精细控制需求的应用场景。在Android平台中,系统原生存在压缩效率低、可控性差等问题,难以满足高性能图片处理需求。 阅读详情

相关推荐

麒麟OS恢复出厂设置原理与实操:非重装的系统状态回滚

Linux操作系统中的‘恢复出厂设置’并非简单重装或镜像还原,而是一种基于状态快照、包管理与配置模板的可控回滚机制。其核心原理依赖LVM快照技术、RPM包签名验证和预置配置模板,兼顾系统稳定性与用户数据安全。该方案在政务、教育等国产化场景中具有显著技术价值——不格式化硬盘、不丢失/home文档、不重配驱动与授权,大幅降低运维复杂度。典型应用场景包括系统卡顿修复、软件冲突清理、桌面环境异常恢复等。本文深入解析银河麒麟V10的kylin-restore-cli工具链与麒麟管家集成逻辑,聚焦‘恢复出厂设置’这一高

weixin_30879169的博客 746

手把手教你生成自己的图片压缩的so库

最近安卓开发里面最火的是什么?NDK开发啊,之前面试的时候好几家公司都问我会不会这个,或者直接就出了这样类型的笔试题,当时的我也是一脸懵逼。恰好这段时间研究了图片压缩和视频压缩的NDK开发,话不多说,开干吧! 以往的图片压缩大家都知道无非是进行图片质量压缩和按比例压缩,但是这样不...

weixin_33735077的博客 724

用Multisim和74HC系列芯片,手把手教你搭建一个能“算数”的简易CPU模型

本文详细介绍了如何使用Multisim仿真软件和74HC系列芯片搭建一个简易CPU模型,重点解析了74HC194寄存器和74HC283加法器的核心功能与连接方法。通过分步图解和实战调试,帮助读者理解CPU工作原理,掌握数字电路设计的基本技能,适合计算机组成原理初学者和电子爱好者实践学习。

weixin_26843605的博客 133

android 编译 libjpeg-turbo,编译Android环境的libjpeg-turbo

1、libjpeg 和 libjpeg-turbo为了在Android环境实现无损压缩或者我们为了实现更高性能的jpeg图像压缩,我们需要使用到libjpeg-turbo1。官网上已说, libjpeg-turbo is generally 2-6x as fast as libjpeg。所以,一般我们选用libjpeg-turbo而不是libjpeg,因为前者快后者2-6倍2、编译过程2.1 下...

weixin_33558958的博客 482

控制障碍函数(Control Barrier Function,CBF) 二、示例

使用一个经典简单的示例讲解CBF的推导

Lyajpunov的博客 6429

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1891

Android 比较完美 图片压缩方法

多种压缩方式常用的有尺寸压缩、质量压缩以及通过JNI调用libjpeg库来进行压缩,三种方式结合使用实现指定图片内存大小,清晰度达到最优,下面就先分别介绍下这几种压缩方式 1. 质量压缩 设置bitmap options属性,降低图片的质量,像素不会减少 第一个参数为需要压缩的bitmap图片对象,第二个参数为压缩后图片保存的位置 设置options 属性0-100

sinat_30058101的博客 988

从交换机安全配置,看常见局域网攻击

前言 构建零信任网络,自然离不开网络准入(NAC),这就涉及到交换机的一些安全测试,于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击,那么下面提到的各种攻击方式,自然是建立在交换机安全配置之上来说的。我们通过h3c官方提供的《H3C 交换机安全加固手册》和《安全配置指导》,从这两份手册可以看出交换机支持的安全配置非常多,基本已经覆盖了各种我们熟知局域网攻击。下面就挑几个典型的攻击方式进行演示。 arp欺骗 【一>所有资源获取&lt

kali_Ma的博客 1万+

Android 图片压缩之多种压缩方式结合使用

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!资料⬅专栏获取。

2401_85764455的博客 815

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4153

3、神经网络在汽车中的应用

本文探讨了神经网络在现代汽车中的多种应用,包括防抱死制动系统(ABS)、燃油喷射系统、自动驾驶辅助系统以及发动机故障诊断。通过详细分析这些系统的具体工作流程和神经网络的集成方式,展示了神经网络如何提升车辆的安全性、效率与智能化水平。

moss5的博客 233

Android常用的图片压缩详解

Android客户端获取相册图片多张一起上传服务器时,如果不进行图片处理,可能会导致内存泄漏问题。这时图片压缩就至关重要了。但是又不能影响图片的清晰度。 压缩方式1: 设置图片格式 Android目前常用的图片格式有png,jpeg和webp。 png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式。 jpeg:有损压缩图片格式,不支持背景透明,...

听海的博客 9092

一文带你了解什么是RDMA

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种起源于高性能计算领域的通信技术,如今已广泛应用于数据中心。该技术使得用户程序能够绕过操作系统内核及CPU,直接与网络接口卡(NIC)交互,实现网络通信。这种方式不仅大幅提升了通信带宽,还显著降低了网络延迟,优化了整体性能。

嵌入式技术开发 6005

Android NDK编译libjpeg-turbo压缩图片

Android开发中,我们经常要面对图片压缩,大部分人使用Android Bitmap进行压缩,还有一些使用libjpeg压缩,之前有用过libjpeg,压缩效果相当惊艳,在保证图片损失较小的同时,还极大的减小了图片体积,不过这次我们基于libjpeg-turbo做图片压缩,据官方说速度提升2-6倍。 libjpeg-turbo is a JPEG image codec that u...

peakchao 2353

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android编译libjpeg-turbo so高效压缩图片

首先 建立一个项目 吧那个C++啥的勾上 然后当前Moudlegradle配置 apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.a15735.test" minSdkVersion 15 ta...

编程之美 2580

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

图片压缩, android studio编译libjpeg, libjpeg-turbo

``` 1. android studio 配置 cmake ndk16 编译环境[ndk17废弃armeabi架构] 2. 下载libjpeg[https://github.com/libjpeg-turbo/libjpeg-turbo] 3. android studio新建空工程, 在app主目录下新建jni目录, 将libjpeg放入jni目录 4. android studio app目...

kalu_153437803的博客 993

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

高性能图片压缩 —— libjpeg-turbo 的编译与集成

前言 Android 提供的 JPEG 压缩, 是由外部链接库中的 libjpeg 实现的, 但 Google 考虑到 Android 设备性能的瓶颈, 在 Skia 调用中的三方链接库 libjpeg 时, 多处进行了阉割处理, 这样带来的好处就是压缩的速度更快了, 但细节丢失严重, 压缩后甚至有偏绿的情况, 下面的代码便是 Android 执行 JPEG 压缩的关键 /** * SkImag...

weixin_33734785的博客 1098

Android libjpeg图片压缩模块

首先去这个地址下载: https://github.com/bither/bither-android-lib 解压获取这个libjpeg-turbo文件的文件,里面只留jni文件夹,其他全部删除, 之后进行编译libjpeg.so包,编译的时候先要进入到jni文件夹里面,执行下面命令 命令:ndk-build APP_ABI=armeabi-v7a,armeabi  编译成功之后会在j...

Kawa103的博客 773

Android-JNI开发系列《十》实践利用libjpeg-turbo完美压缩图片不失真

人间观察 步入社会后,你会发现,老人说的话都是对的。 前面讲了些Android的jni知识和bitmap的实践,接下来几篇应该都是Android中jni的一些实践。这篇我们对Android中图片在jni层利用libjpeg-turbo进行大小压缩,并且压缩后不失真,清晰度和原图基本无差别。 背景 libjpeg开源的JPEG图像库,它使用非常广泛,Android也依赖libjpeg来压缩图片,但是Android不是直接使用libjpeg,而是基于一个叫Skia的开源项目来作为的图像处理引擎,Skia对l.

顾修忠的博客 4696

libjpeg哈夫曼算法压缩图片

之前的博客提到过关于图片压缩的方法: Android 图片压缩,Bitmap优化 Android原生的压缩方法,不在乎两种:通过设置simpleSize根据图片尺寸压缩图片;通过Bitmap.compress方法通过压缩图片质量,去压缩。但是我们当我们对图片质量和图片文件大小同时存在要求时,我们发现无论怎么去设置参数,我们所做的效果总是不能尽如人意,而且同样大小的图片,效果却总是

B1ueKid的博客 3067

android图片压缩终极解决方案

首先说一下论坛其他同学的压缩方法,基本上都是bitmap.compress方法,要么压缩尺寸,要么降低图片质量,这种帖子一翻一大堆。有这方面开发的同学应该知道,通过这种压缩方式压缩完的图片效果很差,根本无法与市场上的成熟app图片压缩功能相比。原因出在哪呢? 我们的调查之路开始了,cnblogs上有一篇文章《为什么Android的图片质量会比iPhone的差?》 htt

nomisshe的专栏 2533

Android 高效图片压缩

使用libjpeg-turbo进行图片压缩 1. JEPG 是什么? 相信有一部分使用 iPhone 手机用微信发送图片的时候,明明图片大小只有 1M ,但清晰度比 Android 手机 5 M 图片大小的还要清晰,那么这是为什么呢 ?。 当时谷歌开发 Android 的时候,考虑了大部分手机的配置并没有那么高,所以对图片处理使用的是 Skia。当然这个库的底层还是用的 jpeg 图片压缩处理。但是为了能够适配低端的手机(这里的低端是指以前的硬件配置不高的手机,CPU ...

lixiong0713的博客 2万+

Android_NDK图片压缩之Libjpeg库使用

欢迎加入技术谈论群:714476794一、前言Android图片压缩处理确实不如Ios,之前完全没听过libjpeg这个东西,工作闲余时间研究了了一天,总结下吧libjpeg的介绍可以参考文章:http://blog.csdn.net/talkxin/article/details/50696511二、编码前准备工作1、ndk环境搭建ndk工具包下载可以到http://www.androiddev...

hqiong208的博客 8442

Android编译libjpeg-turbo so

很简单apply plugin: 'com.android.application' android { compileSdkVersion 27 defaultConfig { applicationId "com.example.myapplication" minSdkVersion 16 targetSdkVersion 2...

qq_36523667的博客 1502
上一篇: Android获取手机cpu架构,支持的指令集
下一篇: 一个可以自动调用OnSaveInstanceState保存并恢复数据的框架
一不小心_
博客等级 码龄12年 101粉丝 83原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值