- 浏览: 646440 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (213)
- JAVA (53)
- Tomcat (14)
- EXTJS专栏 (2)
- 数据库 (23)
- JavaScript (13)
- jQuery (11)
- 需求分析 (2)
- css (1)
- 手机 (1)
- php (7)
- 生活 (1)
- ssh (11)
- JFReeChart (2)
- Delphi (1)
- junit (0)
- liunx (10)
- 项目管理 (11)
- 文件下载 (1)
- Eclipse (2)
- jsp (2)
- 外挂、游戏 (1)
- 面试题 (8)
- 性能测试 (2)
- apache (1)
- MyBatis (1)
- Webservice (2)
- ant (1)
- IDEA (2)
- log4j (1)
- 小程序 (1)
最新评论
-
hll127:
请问service这个方法里为什么要while(true)啊? ...
jsp页面静态化例子 -
tarena1:
Spring 源码解读 推荐流程 -
konglx:
springaop_springmvc 写道可以参考最新的文档 ...
Web项目添加Maven支持步骤 -
springaop_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Web项目添加Maven支持步骤 -
9976:
很好,谢谢
Spring 源码解读 推荐流程
引言
相信大家平时碰到过一些在JAVA中对图像进行处理的需求,比如需要对上传的图片加上自己的签名或图标,或者生成和解析动态的GIF图片,以及处理PSD文件图像信息。本文就JAVA在图像处理中一些基本应用进行了介绍。希望通过能够对大家在以后的图像处理中有些帮助。
一、对一个现有的图片进行文字和图标的合成
我们先从下面的这段简单的代码开始
import java.awt.*; import javax.imageio.ImageIO; import com.sun.image.codec.jpeg.*; /** * @author Anders.Hu * 2005-01-12 */ public class Test { public static void main(String[] args) { try { //读取模板图片内容 BufferedImage image = ImageIO.read(new FileInputStream("c:\\1.jpg")); Graphics2D g = image.createGraphics();//得到图形上下文 g.setColor(Color.BLACK); //设置画笔颜色 //设置字体 g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 15));//写入签名 g.drawString("很好吃诶,要不要也来一口?",43, image.getHeight() - 10); g.dispose(); FileOutputStream out = new FileOutputStream("c:\\2.jpg"); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } catch(Exception e) { e.printStackTrace(); } } } |
相信大家看到这里已经知道了大致的操作过程,我想我还是在这里把基本的原理简单说明一下便于对后续内容的阐述:首先我们通过javax.imageio.ImageIO的read方法读取图像在BufferedImage中,然后我们可以通过BufferedImage的createGraphics方法取得图像的上下文便于对图像的处理,如加上自己喜爱的文字或图片等,最后调用JPEGCodec的encode方法进行JPEG编码,然后就是保存到文件中了。
这就是我运行上面代码的结果
需要提出的是JPEGCodec是非标准类,如果程序是运行JDK1.4以上版本的话,可以采取以下代码进行JPEG编码ImageIO.write(image, "JPEG", out);
可能在你的实际需求还要加入一些图标的修饰,要做到这一步,我们只需要在上面的代码中利用Graphics2D的drawImage方法做到。下面是加入图标的代码
public static void main(String[] args) { try { BufferedImage image = ImageIO.read(new FileInputStream("c:\\1.jpg")); //读取图标 BufferedImage image_biao = ImageIO.read(new FileInputStream("c:\\i.jpg")); Graphics2D g = image.createGraphics(); g.setColor(Color.YELLOW); g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 25)); g.drawString("很好吃诶,要不要也来一口?",43, image.getHeight() - 80); //写入图标 g.drawImage(image_biao, 20,image.getHeight() - 80, image_biao.getWidth(null), image_biao.getHeight(null), null); g.dispose(); FileOutputStream out = new FileOutputStream("c:\\3.jpg"); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } catch(Exception e) { e.printStackTrace(); } } |
代码运行的结果如下
二、生成和解析动态的GIF图片
有了以上对图象的基本处理之后,我们再来看看对动态GIF图片的处理。
GIF是一种由CompuServe创建的压缩和传送图像文件的格式。
GIF图像是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色)。GIF文件内部分成许多存储块,用来存储多幅图像(Frame)或者是决定图像表现行为的控制块,用以实现动画和交互式应用。因此我们要生成和分析GIF图像的话,就需要对GIF文件格式进行分析,这里我们采用网上的一个开源代码进行处理。
先在http://www.fmsware.com/stuff/gif.zip 下载处理GIF图片的代码,解压之后可以发现有AnimatedGifEncoder.java, GifDecoder.java, LZWEncoder.java,NeuQuant.java这4个JAVA文件,在这些文件的开头都已经有了简单的说明。其中AnimatedGifEncoder.是用来生成GIF文件的类,而GifDecoder则是用来解析GIF动态图像Frame信息的类。LZWEncoder是LZW压缩算法类,NeuQuant是用来生成颜色列表的类。
把它们加入到我们的项目文件中,然后我们就来利用AnimatedGifEncoder来写一段合成动态GIF文件的代码。
import java.io.FileInputStream; import javax.imageio.ImageIO; import open.AnimatedGifEncoder; /** * @author Anders.Hu * 2005-01-13 */ public class TestMakeGIF { public static void main(String[] args) { try { //指定Frame的文件 String imgFileName[] = new String[]{"c:\\1.jpg","c:\\2.jpg", "c:\\3.jpg"}; String outputFileName = "c:\\test.gif"; AnimatedGifEncoder e = new AnimatedGifEncoder(); e.start(outputFileName);//开始处理 e.setDelay(500); //设置延迟时间 for (int i = 0; i < imgFileName.length; i++) { e.addFrame(ImageIO.read(new FileInputStream(imgFileName[i])));//加入Frame } e.finish(); } catch (Exception e) { e.printStackTrace(); } } |
代码运行的结果如下
是不是觉得有了这个AnimatedGifEncoder类,合成GIF文件挺方便的,现在我们再来看看GifDecoder的使用。
public class TestGifDecoder { public static void main(String[] args) { try { String inputFileName = "c:\\test.gif"; GifDecoder decoder = new GifDecoder(); decoder.read(inputFileName); int n = decoder.getFrameCount();//得到frame的个数 for (int i = 0; i < n; i++) { BufferedImage frame = decoder.getFrame(i); //得到frame int delay = decoder.getDelay(i);//得到延迟时间 //生成JPG文件 String outFilePath = "c:\\test_"+i+".jpg"; FileOutputStream out = new FileOutputStream(outFilePath); ImageIO.write(frame,"jpeg",out); } } catch (Exception e) { e.printStackTrace(); } } } |
代码运行完毕之后,就可以生成了相应的4个jpg文件。
对于以上的代码有下面几点需要补充:
1. 我测试过使用BMP文件的情况,但是没有通过代码的测试,可能是在把BMP图像转为256色图像时出现了错误。所以在使用之前还需要用其他工具把BMP文件转为JPG格式。
2. 在合成GIF文件的AnimatedGifEncoder类中有下面几个值得关注的函数
2.1:setFrameRate(float)每秒种播放的帧数
2.2:setQuality(int quality) 设置在GIF规范中转换为256位图像时的质量参数这个值设置的越小,质量越高,但速度越慢,反之依然,不过超过20以后,速度不会有明显的提升,默认为10。
2.3:setSize(int x,int y) 设置GIF图像的大小,默认值为第一个加入的帧的图像的大小。
三、对PSD图像文件的分析
我们先用PS对模板图片加上一串字符,保存为TestPsd.psd,注意保存时不要合并图层。然后从http://www.fmsware.com/stuff/PSDReader.java 下载一个分析PSD代码的JAVA文件,并加入到我们的项目中。并运行下面的代码
import java.awt.Point; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import open.PSDReader; import com.sun.image.codec.jpeg.*; /** * @author Ander.Hu * 2005-10-13 */ public class TestPsd { public static void main(String[] args) { try { PSDReader r = new PSDReader(); r.read("c:\\testPsd.psd"); int n = r.getFrameCount(); for (int i = 0; i < n; i++) { BufferedImage image = r.getLayer(i); Point offset = r.getLayerOffset(i); //生成JPG文件 String outFilePath = "c:\\testPsd_"+i+".jpg"; FileOutputStream out = new FileOutputStream(outFilePath); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); } } catch(Exception e) { e.printStackTrace(); } } } |
此时我们便可以发现3个解析后的JPG文件,因为包括背景图层在内有3个图层,故有3个JPG文件。 目前PSDReader 类只支持没有压缩过的或者使用RLE压缩的RGB文件,并且也不支持PS3.0以上的特殊功能。
总结
在JAVA对图像的处理过程中,通常基本步骤是通过读取图像信息到图像缓冲中->同时取得图形上下文->对图像进行相应的处理->生成图像文件。
- gif.zip (16.8 KB)
- 下载次数: 11
- PSDReader.rar (4.1 KB)
- 下载次数: 8
发表评论
-
tomcat7下对HTTPS的部署配置
2018-11-09 15:33 7491、申请CA证书,可以在腾讯云或者阿里云申请到免费的CA ... -
IDEA切换 svn 问题
2017-11-27 09:21 4910今天项目,本来以为就几分钟的事没想到,还出现报错了,错误日记 ... -
log4j cfx 接口请求、返回信息 日志文件分离
2017-06-28 15:04 2101log4j.rootLogger=info,stdout, ... -
junit 启动报错:java.lang.NoClassDefFoundError
2013-04-17 19:31 1603junit 启动报错:java.lang.NoClassDe ... -
Java中抽象类和接口的区别
2013-04-16 12:12 990小结 1.abstract class 在 Java ... -
web.xml中servlet, bean, filter, listenr 加载顺序汇总
2013-03-28 16:17 1512web.xml中servlet, bean, filter, ... -
深入Java虚拟机JVM类加载初始化学习笔记
2013-03-26 20:39 12071. Classloader的作用,概括来说就是将编译后的c ... -
http代理出错Proxy Error
2013-03-22 09:15 1609最近项目突然访问几下次报: Proxy Error ... -
通过javamelody监控web应用的性能指标
2013-03-04 12:00 17381、问题背景 为了提升应用的性能我们可能需要做很多分析和 ... -
javamelody监控
2013-03-04 11:50 1481. 将 javamelody-1.42.0.war 文件部署 ... -
myeclipse安装svn插件的肯定可行的方法
2012-12-18 21:26 9201、下载最新的SVN包:http://subclipse.ti ... -
WordTemplate 使用
2012-03-27 11:28 1195http://wiki.softartisans.com/di ... -
asyn4j 异步方法调用框架
2012-03-14 14:19 1923例子: 1.调用普通方法 主方法 ... -
asyn4j -- 异步方法调用框架
2012-03-14 14:15 01.3更新 优化代码 新增任务持久与恢复功能 ... -
JasperReport
2011-09-01 13:45 1242“在JRE 5以上的java环境中,java会自动加载$JAV ... -
解决Linux操作系统下AES解密失败的问题
2011-03-11 16:00 6995现象描述: windows上加解密正常,linu ... -
使用set+list进行过滤重复并排序
2011-02-28 11:30 1796有时要把有重复的数据用set去掉重复元素,但用set后又把元素 ... -
ssh 事务
2011-01-12 23:03 1149ssh在做事务提交时,不能直接用Sql语句进行insert i ... -
struts2与 json
2011-01-10 09:17 1199需要注意的是,如果用JSON插件把返回结果定为JSON。而JS ... -
struts2返回json数据问题
2011-01-06 20:58 1269最近同事反映struts2返回数据不了json数据,特意测试了 ...
相关推荐
在Java编程环境中,数字图像处理是一项重要的技术,广泛应用于图像分析、识别、增强等领域。"JAVA基本数字图像处理"这个项目旨在通过Java语言实现一系列基本的图像操作,以帮助开发者理解图像处理的基本原理并掌握其...
在人工智能领域,Java图像处理类库也扮演着重要角色,尤其是在计算机视觉和机器学习应用中。例如,它们可以用于预处理图像数据,以便于训练深度学习模型。开发者可以利用这些库来提取特征、标注图像、识别物体,甚至...
11. **JAVA图像处理库**:如OpenCV的JAVA接口,它可以提供更高级的图像处理功能,如对象识别、人脸识别等。 在"CODE"文件夹中,你可能会找到对应的源代码示例,涵盖了上述知识点的实际应用。通过阅读和分析这些代码...
数字图像处理技术是计算机科学和技术的重要组成部分,随着计算机技术的迅速发展,该技术在各个领域的研究和应用日益深入和广泛。数字图像处理技术的应用包括图像的获取、存储、处理和显示等多个方面。该技术的发展...
Java作为一种广泛应用的编程语言,提供了丰富的库和API来支持图像处理任务。本文将深入探讨一个基于Java的图像处理程序的关键概念与实现细节。 #### 图像数据模型 Java中的`BufferedImage`类是处理图像的核心对象...
在本项目中,"java实现图像处理小工具"是一个基于Java编程语言开发的图像处理应用程序。这个工具提供了丰富的功能,允许用户对图像进行各种视觉效果的调整,包括但不限于以下方面: 1. **亮度调整**:亮度是图像的...
通过学习和实践这本教材,读者不仅可以掌握图像处理的基本原理,还能利用Java进行实际的编程项目,从而提升在图像处理领域的技能和应用能力。无论是学术研究还是工程开发,这本书都是一份宝贵的资源。
在 Java 图像处理中,还有很多其他的技术和方法可以用于图像处理,如图像滤波、图像变换、图像识别等。这其中的一些技术包括: * 图像滤波:使用 Filtering API 实现图像滤波,如高斯滤波、 Sobel 滤波等。 * 图像...
Java技术在图像处理领域的应用探究是一个深入分析Java语言如何在图像处理方面发挥作用的技术论文。...通过了解Java技术在图像处理中的这些应用,开发者能够更好地掌握和利用Java语言在图像处理领域的强大功能。
本篇文章将深入探讨Java语言在数字图像处理中的应用,并基于“数字图像处理:Java语言算法描述”这一主题展开讨论。 首先,我们要理解数字图像的基本概念。数字图像是一种以数字形式表示的图像,由像素阵列组成,每...
Java图像处理源代码是开发者们在进行图形用户界面(GUI)开发时常用的一种工具,尤其在需要对图像进行各种操作,如裁剪、旋转、滤镜应用等场景下。这个资源提供了一个完整的Java图像处理功能集,旨在方便开发人员...
1. **Java图像处理库**:Java提供了丰富的API来处理图像,如Java AWT(Abstract Window Toolkit)和Swing库中的`java.awt.image`包。这些库包含了基本的图像处理功能,如图像的加载、显示、保存和颜色空间转换。 2....
Java图像处理程序模板是用于开发图像操作和分析应用的基础框架,它可以帮助开发者快速构建功能丰富的图像处理项目。...通过理解和熟练运用上述知识点,你可以根据需求定制出满足特定场景的图像处理应用。
### 谈Java图像处理技术 #### Java 2D中的图像处理模型 Java 2D是一种用于绘制图形、处理图像的技术框架,它为开发者提供了一系列高级API,使得图像处理变得更加简单高效。Java 2D中的图像处理模型主要采用即时...
所有这些算法在Java中实现时,通常需要使用到如Java AWT或Swing库的图像处理功能,或者使用更专业的图像处理库如OpenCV。通过编程实现这些算法,可以更好地理解它们的工作原理,并能灵活地应用于实际的图像处理任务...
在Java编程语言中,图像处理是一项重要的功能,可以用于创建、编辑或操作图像。本教程将探讨两个关键的图像处理技术:模糊处理和锐化处理。这些技术在图像分析、图像增强以及艺术创作中有着广泛的应用。 模糊处理是...
Java图像处理主要涉及Java Advanced Imaging (JAI) API和Java Image I/O (JIO) API。JAI API是Sun Microsystems开发的一个高级图像处理工具,它作为Java Media Framework的一部分,为Java 2D API提供了扩展,专门...