在Java应用程序中创建图像

合成图像

您不必从文件中读取所有的图像 — 您可以创建自己的图像。要创建自己的图像,最灵活的方法是用一个BufferedImage对象,它是Image类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中。它还支持各种存储像素数据的方法:使用或不使用 alpha 通道、不同种类的颜色模型以及颜色组件的各种精确度。ColorModel类提供一种灵活的方法定义各种颜色模型,以和 BufferedImage对象一起使用。为了理解颜色模型工作的基本知识,我们将只使用一个缺省的颜色模型,其颜色组件由 RGB值和一个缓冲类型(存储 8 位的RGB 颜色值加上一个alpha 通道)组成。这一缓冲类型由 BufferedImage类中的常量 TYPE_INT_ARGB 指定,它意味着每个像素要用一个int值。每个像素的值是以 8 位字节形式存储一个alpha 组件加上 RGB 颜色组件。我们可以用给定的宽度和高度创建一个这种类型的BufferedImage对象,代码语句如下:

int width = 200;
int height = 300;
BufferedImage image = new BufferedImage(width,
height,BufferedImage.TYPE_INT_ARGB);

这段代码创建了一个BufferedImage对象,它代表一个200像素宽、300像素高的图像。为了应用这个图像,我们需要有图形上下文,而 BufferedImage对象的createGraphics()方法就返回一个与该图像相关的Graphics2D对象:

int width = 200;
Graphics2D g2D = image.createGraphics();

使用 g2D对象的操作会修改 BufferedImage对象 image 的像素。利用这个对象,您现在完全有能力应用 BufferedImage对象。您可以绘制形状、图像、GeneralPath对象或任何别的东西,还可以为图形上下文设置alpha 组合对象。您同时还拥有 Graphics2D对象提供的全部仿射变形能力。

如果要从 BufferedImage对象获取单个像素,可以通过调用它的getRGB()方法,并提供该像素的x,y 坐标作为int类型的参数。这个像素会按 TYPE_INT_ARGB 格式以 int类型返回,它由四个8 位的值(代表 alpha值和 RGB 颜色组件)组成一个32 位字。同时 getRGB() 还有一个重载的版本,它从一部分图像数据中返回一个像素数组。您也可以通过调用 setRGB()方法来设置单个像素。前两个参数是该像素的坐标值,第三个参数是待设定的值,类型为int。这个方法也有一个版本可以设置像素数组的值。

至此我们已经完成了像素操作的学习。下面我们要建立一个applet,它在Wrox 徽标背景上使 BufferedImage对象具有动画效果。我们的示例还将演示怎样能让图像局部透明。applet 的基本内容如下所示:

import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.*;
public class ImageDrawDemo extends JApplet
{
 // The init() method to initialize everything...
 // The start() method to start the animation...
 // The stop() method to stop the animation...
 // The ImagePanel class defining the panel displaying the animation...
 // Data members for the applet...
}

创建一个图像

一个子图形是一个小的图形图像,可以将其绘制在静态图像以创建动画。要创建动画效果,您只要随着时间推移,在不同的位置和方向上绘制子图形。当然,利用坐标系的变形可以使之简化许多。游戏经常使用子图形 — 由于您只需要在一个静态背景上绘制子图形,所以可以使动画所占用的处理器的时间大大减少。我们对使用 BufferedImage对象的兴趣意味着我们将不再花费精力去研究减少处理器时间的最佳技术,而是把注意力放在理解怎样才能在一个程序内部创建和使用图像上。

我们的BufferedImage对象看上去如图 1 中的图像:


图 1. BufferedImage 子图形

这个图像是一个以 spriteSize 为边长的正方形。图像其它部分的尺寸值都与这个边长相关。实际上这里只有两个几何实体,一条线和一个圆,都在不同位置和方向重复出现。如果我们创建一个Line2D.Double对象代表线,创建一个Ellipse2D.Double对象代表圆,那么我们就可以通过移动用户坐标系和画这两个对象中的一个或其它的对象而画出整个图像。

时间: 2024-10-24 16:19:24

在Java应用程序中创建图像的相关文章

Java应用程序中创建图像

合成图像 您不必从文件中读取所有的图像 ― 您可以创建自己的图像.要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中.它还支持各种存储像素数据的方法:使用或不使用 alpha 通道.不同种类的颜色模型以及颜色组件的各种精确度.ColorModel 类提供一种灵活的方法定义各种颜色模型,以和 BufferedImage 对象一起使用.为了理解颜色模型工作的基本知识,我们将只使用一个缺省的颜色模型,其颜

如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图(转)

window|程序 如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图在 Java 应用程序中加载位图文件的逐步指南 作者:Jeff West 和 John D. Mitchell 摘要目前,标准的 getImage() 方法仅支持 GIF 和 JPEG 图像.尽管存在用于读取 PNG(可移植网络图形)格式的 Java 例程,但我们还没听说过有用于读取 Microsoft Windows 位图图像的阅读程序.Jeff West 撰写的这篇技巧提供了加载

在JAVA应用程序中如何实现FTP的功能 (转)

程序 在JAVA应用程序中如何实现FTP的功能 大连捷通电脑技术有限公司 王 淼 ---- 在JAVA的编程中,您也许会遇到FTP方面的编程,本文就来演示如何实现它. ---- 本程序是由JBUILDER2.0来开发的,为了节约篇幅我只列出主要的三个部份.FtpList 部分是用来显示FTP服务器上的文件(附图略).GetButton部分为从FTP服务器下传一个文件.PutButton 部分为向FTP服务器上传一个文件.别忘了在程序中还要引入两个库文件(import sun.net.*,impo

如何将网站上的json数据导到我的java小程序中?

问题描述 如何将网站上的json数据导到我的java小程序中? 我刚学完java基础,打算单纯用java做一个股票数据查询小程序.在聚合数据上找到了一个资料:http://www.juhe.cn/docs/api/id/21 ,我不知道要怎么弄了. 解决方案 发送http请求,读取返回的json数据,存到文件等,然后java程序访问文件 解决方案二: JAVA用POST向网页发送请求,接收数据 下面是一个范例程序: import java.io.BufferedReader; import ja

如何集成Perf4j到Java应用程序中并生成性能数据

在实际部署的生产环境能够以较低的风险及成本实现对业务逻辑级别性能问题的追踪.本文将介绍如何集成 Perf4j 到 Java 应用程序中并生成性能数据. 系统日志是应用程序问题诊断及运行维护的重要工具.Logback.Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数.状态的变化及异常信息通过日志输出.本文将要介绍的 Perf4j 是一款专门用于 Java 服务器端代码计时.记录日志和监控结果的开源工具包.Perf4j 对常用日志工具包进行了扩展,能够将得到

为什么c程序中创建了数据文件,再次打开源代码运行时数据没了?

问题描述 为什么c程序中创建了数据文件,再次打开源代码运行时数据没了? 为什么c程序中创建了数据文件,再次打开源代码运行时数据没了? http://blog.csdn.net/hackbuteer1/article/details/6573488# 就是这个通讯录的代码,在里面创建通讯录后,再次打开运行显示通讯录时就提示通讯录为空. 解决方案 写入文件是否错误,用winhex或者ultraedit看看写文件本身有没有写对. 如果没有,就是写的问题,如果对的,那么就是读的问题.再具体调试有问题的程

分布式企业Java应用程序中实现服务器组协调

如今,许多企业应用程序都由一组合作的分布式进程和服务器交付.例如,可向几乎所有流行的 Java 企业服务器的 Web 请求提供服务器集群功能,这些服务器还可以提供有限的配置选项,如服务器权重和配置重新加载. 虽然大多数 Java 企业服务器具有集群的内置支持,但对于自定义用例来说,在应用程序级并没有现成提供这种支持.作为软件开发人员,我们应该如何管理涉及分布式任务协调或支持多租户应用程序的用例?(多租户应用程序 是要求实例在整体服务器集群或组的子集上被隔离的应用程序.)对于这些类型的用例,我们必

Java数据库程序中的存储过程设计

程序|存储过程|设计|数据|数据库 本文阐述了怎么使用DBMS存储过程.阐述了使用存储过程的基本的和高级特性,比如返回ResultSet.本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言),但是,并不要求你有任何存储过程的编程经历. 存储过程是指保存在数据库并在数据库端执行的程序.你可以使用特殊的语法在Java类中调用存储过程.在调用时,存储过程的名称及指定的参数通过JDBC连接发送给DBMS,执行存储过程并通过连接(如果有)返回结果

在PHP和Java应用程序中使用XML数据库

开始之前 本教程的目标读者是使用XML并希望了解原生XML数据库(本教程中为 IBM DB2 Express-C 9.5)的PHP和Java开发人员.虽然对PHP和Java编程有所了解很有帮助,但是不熟悉这些技术不影响阅读本教程.熟悉XMLDOM 也很有帮助. 关于本教程 本教程说明了如何利用原生XML数据库压缩开发周期.作为示例,我们将修改XML模式并观察代码中的相应变化.开发人员将了解到在PHP和Java技术中使用原生XML数据库所必须掌握的基本知识,包括: 连接到数据库(DB2 Expre