基于java的图片文件格式转换和线性缩放

Java——图片格式转换 java开发中遇到图片转换格式需求 阅读详情

   图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用jimi包,可从http://java.sun.com/products/jimi/下载该包及其源码和demo。

 需要注意的是:jimi提供了对几乎所有图片格式的解码支持,但是为提供gif和tif/tiff格式的编码api,gif编码问题在网上可以找到县相关的源码,tiff好像jai:http://java.sun.com/products/java-media/jai/index.jsp提供了它的编码,
    不过我没有用jai,暂时用jpeg编码代替了。

  察看jimi的源码,在com.sun.jimi.core中是jimi的核心处理api。

public void toJPG(String source, String dest, int quality) {

if (dest == null || dest.trim().equals(""))
 dest = source;

if (!dest.toLowerCase().trim().endsWith("jpg")) {
 dest += ".jpg";
 System.out.println("Overriding to JPG, output file: " + dest);
}
if (quality < 0 || quality > 100 || (quality + "") == null
|| (quality + "").equals("")) {
 System.out.println("quality must between ’0’ and ’100’");
 System.out.println("set to DEFAULT value:’75’");
 quality = 75;

}
try {
 JPGOptions options = new JPGOptions();
 options.setQuality(quality);
 ImageProducer image = Jimi.getImageProducer(source);
 JimiWriter writer = Jimi.createJimiWriter(dest);
 writer.setSource(image);
 // 加入属性设置,非必要
 // /*
 writer.setOptions(options);
 // */
 writer.putImage(dest);
} catch (JimiException je) {
 System.err.println("Error: " + je);
}
}
在进行格式转换时,并不需要关心原图的格式,只要要转换的图片格式在jimi的解码格式范围内,就可以完全透明的进行decode过程:

ImageProducer image = Jimi.getImageProducer(source);

  实际的解码只需要以行代码,就这么简单。

  编码过程最简单的也只需要很少的代码:

JimiWriter writer = Jimi.createJimiWriter(dest);
writer.setSource(image);
// 加入属性设置,非必要
// /*
writer.setOptions(options);
// */
writer.putImage(dest);

  以上代码就完成了图片编码到输出到os生成转换后文件的全过程。

  上面代码中的 writer.setOptions(options)是用来对输出文件的属性进行相关的设置,每种格式的属性都不一样,com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:

  com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:

JPGOptions options = new JPGOptions();
options.setQuality(quality);

  格式转换就这么简单。

  jimi不支持的encode格式的解决

/**
*
* @param source
* @param dest
* @throws JimiException
*/
public void toGIF(String source, String dest) throws JimiException {
 if (dest == null || dest.trim().equals(""))
  dest = source;
 // 1:转换为jpg
 if (!dest.toLowerCase().trim().endsWith("jpg")) {
  dest += ".jpg";
 }
 toJPG(source, dest, 75);

 BufferedImage file_in = null;
 File file = new File(dest);
 try {
  file_in = javax.imageio.ImageIO.read(file);
 } catch (IOException e) {
  e.printStackTrace();
 }

 int end = dest.lastIndexOf(".");
 file.deleteOnExit();
 // output *.gif
 file.renameTo(new File(dest.substring(0, end) + ".gif"));
 // jpg to gif
 AnimatedGifEncoder e = new AnimatedGifEncoder();
 e.start(dest);
 e.addFrame(file_in);
 e.finish();
 
}
这里用到了AnimatedGifEncoder 类,是我在网上搜索到的,对gif编码提供了一个实现,虽然还有待晚善的地方,不过单作格式转关已经够用了:)

AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(dest);
e.addFrame(file_in);
e.finish();

 

  需要注意的是:AnimatedGifEncoder 不能对所有格式的图片正确的识别,所以先要将其他格式转为jpg格式(最简单的方法是用imageIO)

BufferedImage file_in = null;
File file = new File(dest);
try {
 file_in = javax.imageio.ImageIO.read(file);
} catch (IOException e) {
 e.printStackTrace();
}

  这样直接放入BufferedImage中就ok了

e.addFrame(file_in);

  实际的编码过程在上面这句完成。

int end = dest.lastIndexOf(".");
file.deleteOnExit();
// output *.gif
file.renameTo(new File(dest.substring(0, end) + ".gif"));

  最后,在完成之前别忘了用上面几句消灭证据哟:)

  当然这种方法其实并不好,最彻底的方法是修改AnimatedGifEncoder,不过做人涅要厚道坏悖暇故侨思倚吹拇肼铮绻行巳さ呐笥芽梢蕴致垡幌隆?br>
  格式转换解决了,缩放功能也就不算是问题了,以下代码同时实现了格式转关和线性缩放:

/**
*
* @param img
* @param dest
* @throws JimiException
*/
public void toTIF(Image img, String dest) throws JimiException {
 if (!dest.toLowerCase().trim().endsWith("tif")) {
  dest += ".tif";
  System.out.println("Overriding to TIF, output file: " + dest);
 }
 dest = dest.substring(0, dest.lastIndexOf(".")) + ".jpg";
 JimiWriter writer = Jimi.createJimiWriter(dest);
 writer.setSource(img);
 dest = dest.substring(0, dest.lastIndexOf(".")) + ".tif";
 writer.putImage(dest);
}

/**
* 线性改变图片尺寸(可同时改变图片格式)
*
* @param source
* 源文件完整路径
* @param desc
* 目标文件完整路径
* @param ins
* 放大/缩小比率
* @throws JimiException
* @throws IOException
*/
public void changeDimension(String source, String desc, double ins)
throws JimiException, IOException {
 String temp = desc;
 File _file = null;
 if (desc == null || desc.trim().equals(""))
  desc = source;
 if (!desc.toLowerCase().trim().endsWith("jpg")) {
  temp = desc.trim() + ".jpg";
 }
 this.toJPG(source, temp, 75);
 _file = new File(temp); // 读入文件

 Image src = javax.imageio.ImageIO.read(_file); // 构造Image对象
 double wideth = (double) src.getWidth(null); // 得到源图宽
 double height = (double) src.getHeight(null); // 得到源图长
 int iWideth = (int) (wideth * ins);
 int iHeight = (int) (height * ins);
 BufferedImage tag = new BufferedImage(iWideth, iHeight,
 BufferedImage.TYPE_INT_RGB);
 tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 绘制缩小后的图

 if (!temp.trim().equals(desc))
  _file.deleteOnExit();

 if (desc.toLowerCase().trim().endsWith("gif")) {
  AnimatedGifEncoder e = new AnimatedGifEncoder();
  e.start(desc);
  e.addFrame(tag);
  e.finish();
 } else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) {
  this.toTIF(tag, desc);
 } else {
  JimiWriter writer = Jimi.createJimiWriter(desc);
  writer.setSource(tag);
  writer.putImage(desc);
 }
}

  BufferedImage的构造函数中的参数类型为int,所以以上代码在改变图象尺寸时稍有偏差,不过简单演示一下还是可以的。

  jimi的example中可以找到很多单项图片处理功能的demo,有时间可以研究一下,会有不少收获的。 

强化学习 | Multi Agents | Trust Region | HATRPO | HAPPO ICLR2022多智能体论文,将trust region推广到MA上,保证单调递增。学习博客,共7k字,纯手敲。含大量手写笔记。 阅读详情

相关推荐

IC芯片验证 - 手把手教你搭建UVM验证环境

这是一个UVM的demo项目

howard789的博客 3万+

Java实现图片格式转换(通过ImageIO)

文章目录粗略介绍ImageIO一、遍历文件夹二、转换图片格式总结 粗略介绍ImageIO ImageIO是javax.imageio包下的一个类,用于实现Java中关于图片输入输出的一种类,这个类中所有方法均为静态方法,因此调用时直接使用ImageIO.methodName() 即可. 相对于使用FileInputStream这类的节点流,使用ImageIO能真真正正的改变图片的格式而不只是修改图片的后缀名称. 当初看到了ImageIO能真正改变图片格式,因此想着要是以后需要改变图片的格式就不用专门去找某个

Zhangsama1的博客 9140

逆向拆解dy接口a_bogus 1.0.1.19版本核心算法(纯算版)第二部分

本文深入解析了dy接口a_bogus 1.0.1.19版本的核心算法,重点介绍了逆向分析的基础方法论、魔改Base64编码识别与还原、随机数生成与位运算解析等关键技术。通过详细的代码示例和实用技巧,帮助开发者掌握逆向工程中的关键步骤,特别是针对a_bogus参数的生成逻辑和混淆处理。

weixin_29288313的博客 408

Java图片格式转换,转分辨率

然后,我们调用 getScaledInstance() 方法将图像缩放为指定大小,并返回一个 java.awt.Image 对象。如果你需要将其他格式的图像文件转换为 JPEG 格式,例如 GIF、BMP、TIFF 等,可以通过将输入文件的扩展名或 MIME 类型传递给 ImageIO.write() 方法来指定输出格式。在 Java 中,我们可以使用 javax.imageio 和 java.awt.image 包中提供的类和方法,将不同格式的图像转换为 JPEG 格式。

weixin_50971499的博客 1597

STM32与HT7038的高精度电能计量系统设计与实现

本文详细介绍了基于STM32微控制器与HT7038三相电能计量芯片的高精度电能计量系统设计与实现。文章从项目选型出发,深入剖析了硬件电路设计、SPI驱动开发、芯片校准及系统集成等关键环节,为智能电表、能源监控等应用提供了高性价比且稳定的国产化解决方案。

pytorch8learner的博客 389

创意视觉项目实战:用ESP32-S3+OV5640构建智能图像流系统

本文详细介绍了如何使用ESP32-S3开发板与OV5640摄像头模块构建智能图像流系统。从硬件连接到软件配置,涵盖Arduino环境搭建、图像采集优化、WiFi视频流传输及外设集成,为开发者提供完整的实战指南,助力智能家居和机器人视觉项目开发。

tech5的博客 1291

Java工具-实现无损png转换jpg格式

实现无损png转换jpg格式

宣晨光 2175

AES-GCM加密认证模式:原理、优势与实战应用

在数据安全领域,加密与认证是保障信息机密性和完整性的两大基石。加密确保数据内容不被窃取,而认证则验证数据来源的真实性和传输过程中是否被篡改。传统的加密后认证方案如AES-CBC+HMAC需要串行处理,性能开销较大。GCM(伽罗瓦/计数器模式)作为一种认证加密(AEAD)方案,巧妙地将AES-CTR加密与基于伽罗瓦域的GHASH认证并行结合,实现了单次数据遍历即可同时完成加密和认证,大幅提升了处理效率。其核心价值在于高性能、支持附加认证数据(AAD)以及标准化程度高,广泛应用于TLS协议、无线网络安全和云存储

weixin_28622215的博客 312

Java将JPG/PNG图片转换为WEBP格式,以及WEBP转换成JPG/PNG格式

Java将JPG/PNG图片转换为WEBP格式,以及WEBP转换成JPG/PNG格式

一个标题 5301

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

努力让自己发光,对的人才能迎着光而来 9万+

Simulink实例--电动汽车充电站与微电网协同运行仿真

​电网负荷剧增:单站1000台车同时充电需150MW功率(超配电网容量30%)​能源孤岛问题:传统充电站仅作为单向负荷,无法参与电网调频​可再生能源消纳:光伏/风电波动导致充电站功率波动±40%​多目标矛盾:充电效率、电网稳定性、设备寿命的协同优化​节能效果:每百万辆车年节电1.8GWh​成本回收:投资回报周期<4年(IRR>25%)​减排效益:每年减少CO₂排放12万吨。

xiaoheshang_123的博客 330

基于Java的图片文件格式转换和线性缩放

        图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用Jimi包,可从http://java.sun.com/products/jimi/下载该包及其源码和demo。 需要注意的是:Jimi提供了对几乎所有图片格式的解码支持,但是为提供gif和tif/tiff格式的编码api,gif编码问题在网上可以找到县相关的源码,tiff好像jai:http://java.s...

moonights的专栏 211

QProgressBar:常用接口、样式表及自定义进度条实现

在Qt开发中,QProgressBar 是一个非常常用的控件,用于显示任务的进度。无论是文件下载、数据处理还是其他耗时操作,QProgressBar 都能直观地展示当前进度。本文将详细介绍QProgressBar 的使用方法,包括常用接口、样式表设置,并额外补充一个自定义进度条的C++实现。

u011186532的专栏 1012

java 图片文件 格式转换_基于java的图片文件格式转换和线性缩放

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 需要注意的是:AnimatedGifEncoder 不能对所有格式的图片正确的识别,所以先要将其他格式转为jpg格式(最简单的方法是用imageIO) BufferedImage file_in = null; File file = new File(dest); try {欢迎进入Java社区论坛,与200万技术人员互...

weixin_31164189的博客 434

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 图片文件 格式转换_Java的图片文件格式转换和线性缩放

Java的图片文件格式转换和线性缩放 来源:68design.net 2007年07月13日 08:31图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用jimi包,可从 http://java.sun.com/products/jimi/ 下载该包及其源码和demo需要注意的是:jimi提供了对几乎所有图片格式的解码支持,但是为提供gif和tif/tiff格式的编码api,g...

weixin_42405852的博客 231

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

基于Java的图片文件格式转换和线性缩放(2)

这里用到了AnimatedGifEncoder 类,是我在网上搜索到的,对gif编码提供了一个实现,虽然还有待晚善的地方,不过单作格式转关已经够用了:) AnimatedGifEncoder e = new AnimatedGifEncoder(); e.start(dest); e.addFrame(file_in); e.finish();   需要注意的是:AnimatedGifE...

ycb1689的专栏 796

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 文件数据流操作命令及意义
下一篇: Eclipse插件之Spring IDE
hwctl
博客等级 码龄20年 13粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值