在Java应用程序中创建图像(转)

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

int宽度=200;
int高度=300;
=BufferedImage形象   新   BufferedImage(宽度、高度
, BufferedImage.TYPE_INT_ARGB);



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

int宽度=2级200;
Graphics2D=image.createGraphics ();




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

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

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

进口java.awt。*;
进口java.awt.image。*;
导入   java.awt.geom。*;
进口javax.swing。*;

ImageDrawDemo公共类   扩展JApplet
{
//init()方法初始化一切……
//start()方法来启动动画……
//stop()方法来停止   动画……
//ImagePanel类定义面板显示   动画……
//数据成员   applet……
}




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

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

图1所示。BufferedImage子图形


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

如果是按真正面向对象的方法,应该定义一个类代表一个子图形,可能是作为   BufferedImage的一个子类,但由于我们是在探索使用BufferedImage对象的技巧,因此用一个createSprite()方法来画出   BufferedImage对象上的子图形会更适合我们的目的。因为该方法只是我们的applet类的一个成员,所以我们将为applet   添加数据成员以存储任何需要的数据。您可以把我们将使用的数据成员插入到applet类中,如下所示:

在Java应用程序中创建图像(转)