广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java实现1M图片压缩优化到100kb实现示例
  • 470
分享到

java实现1M图片压缩优化到100kb实现示例

2024-04-02 19:04:59 470人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录引言一、图像压缩二、Java数字图像处理三、图像压缩实战四、其他开源库五、一点点心声引言 坦白从宽吧,我就是那个花了两天两夜把 1M 图片优化到 100kb 的家伙—

引言

坦白从宽吧,我就是那个花了两天两夜把 1M 图片优化到 100kb 的家伙——王小二!

自从因为一篇报道登上热搜后,我差点抑郁,每天要靠 50 片安眠药才能入睡。

网络上曝光的那些关于一码通的消息,有真有假,我这里就不再澄清了。就说说我是怎么把图片从  1M 优化到 100kb 的故事吧。

是的,由于系统群体规模和访问规模的特殊性,每一行代码、每一张图片、每一个技术文档都反复核准,优化再优化,精益求精。为确保系统运行得更高效,我们将一张图片从1MB压缩到500KB,再从500KB优化到100KB。

这样的工作在外人看起来,简单到就好像悄悄给学妹塞一张情书就能让她做我女朋友一样简单。

但殊不知,这其中蕴含着极高的技术含量!

不信,我给你们普及下。

一、图像压缩

图像压缩是数据压缩技术在数字图像上的应用,目的是减少图像数据中的冗余信息,从而用更加高效的格式存储和传输数据。

图像压缩可以是有损数据压缩,也可以是无损数据压缩。

怎么样?

是不是感觉图像压缩技术没有想象中那么简单了?

更多关于图像压缩的资料可参考以下链接。

https://www.jb51.net/article/150789.htm

二、Java数字图像处理

作为这次“20 多万外包项目”的“主力开发人员”,我这里就给大家介绍下 Java 数字图像处理技术吧,一开始我就是用它来处理图片的。

数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。

输入的是图像信号,然后经过 DIP 进行有效的算法处理后,输出为数字信号。

为了压缩图像,我们需要读取图像并将其转换成 BufferedImage 对象,BufferedImage 是 Image 类的一个子类,描述了一个具有可访问的图像数据缓冲区,由 ColORModel 和 Raster 的图像数据组成。

废话我就不多说了,直接进入实战吧!

三、图像压缩实战

刚好我本地有一张之前用过的封面图,离 1M 只差 236 KB,可以拿来作为测试用。

这其中要用到 Imageio 类,这是一个静态类,提供了一系列方法用来读和写图像,同时还可以对图像进行简单的编码和解码。

比如说通过 ImageIO.read() 可以将图像读取到 BufferedImage 对象:

File input = new File("ceshi.jpg");
BufferedImage image = ImageIO.read(input);

比如说通过 ImageIO.getImageWritersByFormatName() 可以返回一个Iterator,其中包含了通过命名格式对图像进行编码的 ImageWriter。

Iterator<ImageWriter> writers =  ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = (ImageWriter) writers.next();

比如说通过 ImageIO.createImageOutputStream() 可以创建一个图像的输出流对象,有了该对象后就可以通过 ImageWriter.setOutput() 将其设置为输出流。

File compressedImageFile = new File("bbcompress.jpg");
OutputStream os =new FileOutputStream(compressedImageFile);
ImageOutputStream iOS = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);

紧接着,可以对 ImageWriter 进行一些参数配置,比如说压缩模式,压缩质量等等。

ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.01f);

压缩模式一共有四种,MODE_EXPLICIT 是其中一种,表示 ImageWriter 可以根据后续的 set 的附加信息进行平铺和压缩,比如说接下来的 setCompressionQuality() 方法。

setCompressionQuality() 方法的参数是一个 0-1 之间的数,0.0 表示尽最大程度压缩,1.0 表示保证图像质量很重要。对于有损压缩方案,压缩质量应该控制文件大小和图像质量之间的权衡(例如,通过在写入 JPEG 图像时选择量化表)。 对于无损方案,压缩质量可用于控制文件大小和执行压缩所需的时间之间的权衡(例如,通过优化行过滤器并在写入 PNG 图像时设置 ZLIB 压缩级别)。

整体代码如下所示:

public class Demo {
    public static void main(String[] args) {
        try {
            File input = new File("ceshi.jpg");
            BufferedImage image = ImageIO.read(input);
            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
            ImageWriter writer = (ImageWriter) writers.next();
            File compressedImageFile = new File("bbcompress.jpg");
            OutputStream os = new FileOutputStream(compressedImageFile);
            ImageOutputStream ios = ImageIO.createImageOutputStream(os);
            writer.setOutput(ios);
            ImageWriteParam param = writer.getDefaultWriteParam();
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(0.01f);
            writer.write(null, new IIOImage(image, null, null), param);
            os.close();
            ios.close();
            writer.dispose();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行压缩后,可以看到图片的大小压缩到了 19 KB:

可以看得出,质量因子为 0.01f 的时候图片已经有些失真了,可以适当提高质量因子比如说 0.5f,再来看一下。

图片质量明显提高了,但大小依然只有 64 KB,压缩效果还是值得信赖的。

四、其他开源库

接下来,推荐一些可以轻松集成到项目中的图像处理库吧,它们全都是免费的。

1)ImageJ,用 Java 编写的,可以编辑、分析、处理、保存和打印图像。

2)Apache Commons Imaging,一个读取和写入各种图像格式的库,包括快速解析图像信息(如大小,颜色,空间,ICC配置文件等)和元数据。

3)ImageMagick,可以读取和写入超过100种格式的图像,包括DPX、EXR、GIF、JPEG、JPEG-2000、pdf、PNG、Postscript、SVG和TIFF。还可以调整大小、翻转、镜像、旋转、扭曲、剪切和变换图像,调整图像颜色,应用各种特殊效果,包括绘制文本、线条、多边形、椭圆和贝塞尔曲线。

4)OpenCV,由BSD许可证发布,可以免费学习和商业使用,提供了包括 C/C++python 和 Java 等主流编程语言在内的接口。OpenCV 专为计算效率而设计,强调实时应用,可以充分发挥多核处理器的优势。

这里就以 OpenCV 为例,来演示一下图像压缩。当然了,OpenCV 用来压缩图像属于典型的大材小用。

第一步,添加 OpenCV 依赖到我们的项目当中,以 Maven 为例。

<dependency>
	<groupId>org.openpnp</groupId>
	<artifactId>opencv</artifactId>
	<version>4.5.1-2</version>
</dependency>

第二步,要想使用 OpenCV,需要先初始化。

OpenCV.loadShared();

第三步,使用 OpenCV 读取图片。

Mat src = ImGCodecs.imread(imagePath);

第四步,使用 OpenCV 压缩图片。

MatOfInt dstImage = new MatOfInt(Imgcodecs.IMWRITE_JPEG_QUALITY, 1);
Imgcodecs.imwrite("resized_image.jpg", sourceImage, dstImage);

MatOfInt 的构造参数是一个可变参数,第一个参数 IMWRITE_JPEG_QUALITY 表示对图片的质量进行改变,第二个是质量因子,1-100,值越大表示质量越高。

执行代码后得到的图片如下所示:

借这个机会,来对比下 OpenCV 和 jdk 原生 api 在压缩图像时所使用的时间。

这是我本机的配置情况,早年买的顶配 iMac,也是我的主力机。一开始只有 16 G 内存,后来加了一个 16 G 内存条,不过最近半年电脑突然死机重启的频率明显提高了,不知道是不是 Big Sur 这个操作系统的问题还是电脑硬件老了。

结果如下所示:

opencvCompress压缩完成,所花时间:1070
jdkCompress压缩完成,所花时间:322

压缩后的图片大小差不多,都是 19 KB,并且质量因子都是最低值。

五、一点点心声

经过上面的技术分析后,相信你们都明白了,把1M图片优化到100kb实在是一件“不太容易”的事情。。。。

100KB 很小了吧?只有原来的 1/10。

要知道,我可是连续加班了两天两夜,不眠不休。

累到最后,我趴在电脑上都睡着了。

没想到哈喇子直接给电脑整短路了,我这才算是从梦里面吓醒来了!

?,生活不易,且行且珍惜吧~

GitHub Https://github.com/itwanger/toBeBetterJavaer

以上就是java实现1M图片压缩优化到100kb实现示例的详细内容,更多关于java 1M图片压缩到100kb的资料请关注编程网其它相关文章!

--结束END--

本文标题: java实现1M图片压缩优化到100kb实现示例

本文链接: https://www.lsjlt.com/news/164255.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java实现1M图片压缩优化到100kb实现示例
    目录引言一、图像压缩二、Java数字图像处理三、图像压缩实战四、其他开源库五、一点点心声引言 坦白从宽吧,我就是那个花了两天两夜把 1M 图片优化到 100kb 的家伙—...
    99+
    2022-11-13
  • java怎么实现1M图片压缩优化到100kb
    这篇“java怎么实现1M图片压缩优化到100kb”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java怎么实现1M图片压缩...
    99+
    2023-07-02
  • C#实现无损压缩图片代码示例
    一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,影响用户体验,所以一般会将图片进行压缩。 代码实现...
    99+
    2022-11-13
  • Java实现压缩图片大小
    本文实例为大家分享了Java实现压缩图片大小的具体代码,供大家参考,具体内容如下 使用场景: 1.当使用图片上传功能时,上传图片太大,造成对服务器资源过多的占用2.客户端上传图片尺寸...
    99+
    2022-11-13
  • Java如何实现压缩图片大小
    本篇内容主要讲解“Java如何实现压缩图片大小”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现压缩图片大小”吧!使用场景:当使用图片上传功能时,上传图片太大,造成对服务器资源过多的...
    99+
    2023-06-30
  • Python实现图片压缩的案例详解
    目录1、引言2、PIL模块2.1 quality 方式2.2 thumbnail方式3、OpenCV模块3.1 安装3.2 执行代码4、总结1、引言 小屌丝:鱼哥,求助,求助 小鱼:...
    99+
    2022-11-12
  • java 实现图片像素质量压缩与图片长宽缩放
    目录java 图片像素质量压缩与图片长宽缩放java 修改图片dpi(像素/大小)java 图片像素质量压缩与图片长宽缩放 今天找到的这个方法比以前项目用到的方法更好,这里记录下,方...
    99+
    2022-11-12
  • Android图片实现压缩处理的实例代码
    整理文档,搜刮出一个Android图片实现压缩处理的实例代码,稍微整理精简一下做下分享。详解:获取本地图片File文件 获取BitmapFactory.Options对象 计算原始图片 目标图片宽高比 计算输出的图片宽高根据...
    99+
    2023-05-30
    android 图片 压缩
  • java实现高清不失真图片压缩
    java实现高清不失真图片压缩 从图像文件创建缩略图 Thumbnails.of(new File("original.jpg")) .size(160, 160) .toFile(new File("thumb...
    99+
    2023-09-06
    java
  • Android不压缩图片实现高清加载巨图实例
    目录一、概述二、初识BitmapRegionDecoder三、自定义显示大图控件四、测试参考链接一、概述 对于加载图片,大家都不陌生,一般为了尽可能避免OOM都会按照如下做法:对于图...
    99+
    2022-11-13
  • java实现上传图片并压缩图片大小功能
    Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式...
    99+
    2023-05-31
    java 上传图片 压缩图片
  • Java实现按比例缩小图片
    本文实例为大家分享了Java实现按比例缩小图片的具体代码,供大家参考,具体内容如下 使用spring注解上传文件@RequestParam(value="", r...
    99+
    2022-11-13
  • Java图片批量压缩像素的实现方法
    目录图片压缩大法压缩前大小:压缩后大小:具体代码实现:附:利用Graphics类如何进行压缩图像总结图片压缩大法 为了防止用户流量的丢失,即使在5g 即将来临的情况下,压缩算法依旧是...
    99+
    2022-11-12
  • Android中怎么实现图片压缩并加载显示
    这篇文章将为大家详细讲解有关Android中怎么实现图片压缩并加载显示,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。解析:图片压缩的关键就是options.inSampleSize ...
    99+
    2023-05-30
    android
  • Java 实现LZ78压缩算法的示例代码
    LZ78 压缩算法的 Java 实现 1、压缩算法的实现 通过多路搜索树提高检索速度 package com.wretchant.lz78; import java.util....
    99+
    2022-11-12
  • Java怎么实现按比例缩小图片
    这篇文章主要讲解了“Java怎么实现按比例缩小图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现按比例缩小图片”吧!使用spring注解上传文件@RequestParam(v...
    99+
    2023-06-30
  • C#实现图片缩略图功能的示例详解
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-23
    C#图片缩略图 C# 缩略图
  • java实现上传图片尺寸修改和质量压缩
    本文实例为大家分享了java实现上传图片尺寸修改和质量压缩的具体代码,供大家参考,具体内容如下 package com.zity.frame.util;     import co...
    99+
    2022-11-13
  • Java Socket实现传输压缩对象的方法示例
    本文实例讲述了Java Socket实现传输压缩对象的方法。分享给大家供大家参考,具体如下:前面文章《Java Socket实现的传输对象功能示例》说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情...
    99+
    2023-05-31
    java socket ava
  • java实现图片反色处理示例
    本文实例为大家分享了java实现图片反色处理的具体代码,供大家参考,具体内容如下 效果对比 原图 反色处理 原图 反色处理 核心代码实现 import javax.ima...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作