`

applet文字和图标的合成

阅读更多

相信大家平时碰到过一些在JAVA中对图像进行处理的需求,比如需要对上传的图片加上自己的签名或图标,或者生成和解析动态的GIF图片,以及处理PSD文件图像信息。本文就JAVA在图像处理中一些基本应用进行了介绍。希望通过能够对大家在以后的图像处理中有些帮助。

一、对一个现有的图片进行文字和图标的合成

我们先从下面的这段简单的代码开始
import java.awt.*;
import javax.imageio.ImageIO;
import java.awt.image.*;
import java.io.*;
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对图像的处理过程中,通常基本步骤是通过读取图像信息到图像缓冲中->同时取得图形上下文->对图像进行相应的处理->生成图像文件。

分享到:
评论
3 楼 water84222 2009-11-20  
xuehu2009 写道
哦,不好意思啊。。。linux中没试过。。。

哦,谢谢了。linux下好像真不行,
2 楼 xuehu2009 2009-11-19  
哦,不好意思啊。。。linux中没试过。。。
1 楼 water84222 2009-11-18  
可在linux解析过gif图片,我现在也在用这个来压缩gif图片,但是在linux下解析不出帧来。可遇到这样的问题?

相关推荐

    Applet

    Java Applet是Java技术在早期为了实现网页动态交互而提出的一种技术。Applet是一段用Java语言编写的代码...不过,理解Applet的工作原理和生命周期对于理解Java Web开发的历史和现代Web交互技术的演变仍然具有重要意义。

    关于 js 和 applet 相互调用的例子

    在IT领域,JavaScript(JS)和Applet是两种不同的技术,它们在Web应用程序开发中各自扮演着重要角色。本文将详细探讨如何实现JS与Applet之间的相互调用,并通过一个具体的例子来阐述这一过程。 首先,JavaScript是...

    在JDK和Eclipse下Java_Applet的编写和运行方式

    ### 在JDK和Eclipse下Java Applet的编写与运行详解 #### 一、Java Applet简介 Java Applet是一种可以嵌入到网页中的小型Java应用程序。它可以在支持Java的Web浏览器上运行,使得开发者能够利用Java的强大功能来...

    applet和swing例子

    Java编程语言中,`Applet`和`Swing`是两个重要的GUI(图形用户界面)组件库,用于创建桌面应用程序。这两个技术都是Java Foundation Classes (JFC)的一部分,旨在提供丰富的用户交互体验。 首先,我们来了解`Applet...

    线程和Java Applet讲解

    【线程和Java Applet详解】 线程是Java编程中重要的概念,特别是在开发并发和多任务应用程序时。Java中的线程允许程序同时执行多个任务,提高系统的效率和响应性。线程与进程不同,进程是操作系统分配资源的基本...

    applet与servlet通讯

    在构建多层网络应用时,Java Applet 和 Servlet 常常被一起使用。Applet 提供了构建强大、动态的界面到应用程序的便捷方法,而 Servlet 则为我们提供了高效处理 Web 或应用服务器请求的方式。Sun 的应用编程模型推荐...

    java applet应用实例

    开发者可以使用CSS来调整字体、颜色、边距等元素,使Applet与网页设计保持一致。 4. **GettingStarted.htm** 这可能是一个介绍如何开始开发Java Applet的指南,通常会涵盖下载JDK、设置环境变量、编写第一个Applet...

    Applet小游戏 Applet小游戏 Applet小游戏

    Applet的生命週期包括初始化、启动、绘画、停止和终止等阶段,开发者需要覆盖这些阶段的相关方法来实现具体功能。 接着,我们来探讨"HammerGame"可能包含的游戏机制。由于没有具体的代码或详细描述,只能根据名称...

    java的applet实例

    - 根据文件夹名"Chapter1-examples"推测,这可能是一个教程的早期章节示例,包含了关于如何创建和运行Java Applet的基础代码和实例。 - 学习这个例子,你可以了解Applet的基本结构、如何在HTML中嵌入Applet,以及...

    applet和servlet的通讯,并打印

    在Java编程领域,Applet和Servlet是两种不同的技术,它们分别在客户端和服务器端发挥作用。本文将详细探讨Applet与Servlet之间的通信以及如何利用这种通信机制实现文件的打印功能。 Applet是Java的一种小程序,它...

    一个servlet 和 applet 通讯的完整项目

    在IT领域,Servlet和Applet是两种不同的Java技术,它们分别用于服务器端和客户端的编程。这个"一个servlet 和 applet 通讯的完整项目"提供了实现这两种技术间通信的实际示例,对于理解它们如何协同工作非常有帮助。 ...

    JavaApplet与JavaScript

    JavaApplet 提供了强大的功能,如多媒体处理和网络通信,而 JavaScript 则更侧重于前端的交互性和动态性。通过结合使用这两种技术,开发者能够构建出功能强大且用户体验优秀的 Web 应用程序。然而,随着现代 Web ...

    Java Applet 入门教程

    在20世纪90年代中期,Java Applet是互联网上动态内容的一种流行方式,允许开发者创建可嵌入网页的动态图形、游戏和其他交互式应用程序。 **Java Applet 的工作原理** Java Applet的工作原理基于Java虚拟机(JVM)...

    java applet实例讲解

    Java Applet是Java技术在...总结,Java Applet是Java历史上的一个重要篇章,虽然现在已被其他技术取代,但它的概念和技术仍值得学习和理解。通过实践简单的Applet实例,你可以更好地掌握Java编程和Web开发的基本原理。

    java 开发指南_applet和jsp篇

    Java开发指南——Applet与JSP篇主要涵盖了两个核心概念:Java小应用程序(Applet)和Java服务器页面(JSP)。这两个技术都是Java在Web开发中的重要组成部分,它们各自有其独特的作用和应用场景。 首先,Java Applet...

    applet例子

    这个"applet例子"提供了实践applet编程的机会,通过编写和运行简单的applet程序,可以深入理解Java applet的工作原理和生命周期。虽然现代Web开发更倾向于使用JavaScript和其他技术,但理解applet的历史和工作方式...

    JavaApplet实例及教程

    Java+Applet实例讲解(分为1和2两部分)、Java+Applet实例编程、java+Applet登录、JavaApplet教程.pdf、JAVA_applet应用实例.ppt、JavaApplet编程技巧实例专辑、javaapplet例子.doc、Applet类.doc等教程。...

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    Java的线程和Java Applet是Java编程中的两个重要概念,它们分别涉及并发执行和Web应用程序的执行环境。 **线程**在Java中是程序执行的最小单元,它允许程序在同一时间执行多个任务。Java内置对多线程的支持,使得...

    java applet 简单案例

    这个简单的案例将带你深入理解Java Applet的基础概念、工作原理以及如何创建和运行一个基本的Java Applet。 一、Java Applet简介 Java Applet是一种由Java编写的客户端应用程序,它可以在支持Java的Web浏览器中运行...

Global site tag (gtag.js) - Google Analytics