我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在 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 对象代表圆,那么我们就可以通过移动用户坐标系和画这两个对象中的一个或其它的对象而画出整个图像。

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

double totalAngle; // Current angular position of sprite
double spriteAngle; // Rotation angle of sprite about its center
ImagePanel imagePanel; // Panel to display animation

BufferedImage sprite; // Stores reference to the sprite
int spriteSize = 100; // Diameter of the sprite
Ellipse2D.Double circle; // A circle - part of the sprite
Line2D.Double line; // A line - part of the sprite

// Colors used in sprite
Color[] colors = {Color.red , Color.yellow, Color.green , Color.blue,
Color.cyan, Color.pink , Color.magenta, Color.orange};

java.util.Timer timer; // Timer for the animation
long interval = 50; // Time interval msec between repaints




这些成员的一般用途可以从注释中清楚地看到。下面我们要看一看开发代码时它们是怎样被使用的。

createSprite() 方法需要做的第一件事就是创建 BufferedImage 对象 sprite,然后我们还需要一个 Graphics2D 对象用于在 sprite 图像上绘画。下面就是完成这些操作的代码:

BufferedImage createSprite(int spriteSize)
{
// Create image with RGB and alpha channel
BufferedImage sprite = new BufferedImage(spriteSize, spriteSize,
BufferedImage.TYPE_INT_ARGB);

Graphics2D g2D = sprite.createGraphics(); // Context for buffered image
// plus the rest of the method...
}



sprite 对象的宽和高的值都是 spriteSize,图像的类型为 TYPE_INT_ARGB,就是说每个像素的 alpha 值和颜色组件是以一个单独的 int 值存储的,而颜色是以 8 位的红、绿、蓝组件的形式存储的。这意味着我们的 sprite 图像将占用 40,000 字节,这只是浏览一个网页会占用的内存的很小一部分。而这并不影响网页的下载时间,因为在执行 applet 的时候,这部分内存是在本地机器上被分配的。除了作为网页本身的 HTML 文件的内容外,下载时间还取决于 applet 的 .class 文件的大小,以及在它执行时下载的图像或其它文件。

创建一个透明的背景
在 sprite 图像中,alpha 通道是很重要的,因为我们希望背景能完全透明。在绘画过程中,只有 sprite 对象本身应该是可见的,而不是整个 100×100 的矩形图像。我们可以很容易地实现这一目的,只要开始先使整个 sprite 图像区域透明(即,alpha 值为 0.0f),然后把我们想要画的图形绘制在上面,使之不透明(alpha 值为 1.0f)。以下是使整个图像透明的代码:

// Clear image with transparent alpha by drawing a rectangle
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f));
Rectangle2D.Double rect = new Rectangle2D.Double(0,0,spriteSize,spriteSize);
g2D.fill(rect);




我们首先使用 AlphaComposite 对象按照 CLEAR 规则设置 alpha 合成值,把颜色组件设置为零,又通过设置 alpha 值为 0.0f,使之透明。然后我们填充一个覆盖整个图像区域的矩形。我们不必设置颜色值,因为根据 CLEAR 规则,每个像素的前景和背景色所占成分都是零,所以这两者都不参与像素的生成。但我们仍要填充该矩形,因为这将确定被操作的图像像素。

这里,我们可以稍微了解一下怎样控制图像的质量。

着色微调
对着色操作的许多方面而言,都有一个在质量和速度间选择的问题。着色操作就像大多数事情一样 ? 质量是需要代价的,而这里的代价就是处理时间。所有的着色操作都有缺省设置,其中存在一个选择,缺省设置是特定于平台的,但您可以通过调用用于着色的 Graphics2D 对象的 setRenderingHint() 方法自己选择。虽然只有一些微调,如果您的计算机不支持与您指定的微调相对应的着色操作选项,这些微调就无法生效。

通过添加以下对 createSprite() 方法的调用,可以确保得到由我们的 alpha 合成操作可能生成的最好效果。

BufferedImage createSprite(int spriteSize)
{
// Create image with RGB and alpha channel
BufferedImage sprite = new BufferedImage(spriteSize, spriteSize,
BufferedImage.TYPE_INT_ARGB);

Graphics2D g2D = sprite.createGraphics(); // Context for buffered image

// Set best alpha interpolation quality
g2D.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);

// Clear image with transparent alpha by drawing a rectangle
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f));
Rectangle2D.Double rect = new Rectangle2D.Double(0,0,spriteSize,spriteSize);
g2D.fill(rect);

// plus the rest of the method...
}




RenderingHints 类定义了多种着色微调,它们存储在一个映射集的 Graphics2D 对象里。setRenderingHint() 方法的参数是一个键以及对应的键值。在我们的代码中,第一个参数是代表 alpha 合成微调的键,第二个参数是该微调的值。该微调的其它可能的值有 VALUE_ALPHA_INTERPOLATION_DEFAULT,代表平台缺省值;以及 VALUE_ALPHA_INTERPOLATION_SPEED,代表追求速度而不是质量。

您还可以为下面的键提供微调:

键 描述
KEY_ANTIALIASING 决定是否使用抗锯齿。当着色有倾斜角度的线时,通常会得到一组阶梯式的像素排列,使这条线看上去不平滑,经常被称为 锯齿状图形。抗锯齿是一种技术,它设置有倾斜角度的线的像素亮度,以使线看起来更平滑。因此,这个微调是用来决定在着色有倾斜角度的线时是否在减少锯齿状图形上花费时间。可能的值有 VALUE_ANTIALIAS_ON, _OFF 或 _DEFAULT。
KEY_COLOR_RENDERING 控制颜色着色的方式。可能的值有 VALUE_COLOR_RENDER_SPEED, _QUALITY 或 _DEFAULT。
KEY_DITHERING 控制如何处理抖动。抖动是用一组有限的颜色合成出一个更大范围的颜色的过程,方法是给相邻像素着色以产生不在该组颜色中的新的颜色幻觉。可能的值有 VALUE_DITHER_ENABLE, _DISABLE 或 _DEFAULT。
KEY_FRACTIONALMETRICS 控制显示文本的质量。可能的值有 VALUE_FRACTIONALMETRICS_ON, _OFF 或 _DEFAULT。
KEY_INTERPOLATION 确定怎样做内插。

在对一个源图像做变形时,变形后的像素很少能够恰好对应目标像素位置。在这种情况下,每个变形后的像素的颜色值不得不由周围的像素决定。

内插就是实现上述过程。有许多可用的技术。可能的值,按处理时间从最多到最少,是 VALUE_INTERPOLATION_BICUBIC, _BILINEAR 或 _NEAREST_NEIGHBOR。
KEY_RENDERING 确定着色技术,在速度和质量之间进行权衡。可能的值有 VALUE_RENDERING_SPEED, _QUALITY 或 _DEFAULT。
KEY_TEXT_ANTIALIASING 确定对文本着色时是否抗锯齿。可能的值有 VALUE_TEXT_ANTIALIASING_ON, _OFF 或 _DEFAULT。

我们绕得已经够远了。让我们回到绘制 sprite 上……
[@more@]

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

您不必从文件中读取所有的图像 ? 您可以创建自己的图像。要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中。它还支持各种存储像素数据的方法:使
2023-06-03

建立Java的应用程序(转)

建立Java的应用程序(转)[@more@]Java的普通应用程序中,必须含有一个可被外界(通常是java解释器)所直接调用的类,我们可以把这个类称为该应用程序的主类。建立Java的应用程序1:main成员函数  Java的普通应用程序中,
2023-06-03

在Ubuntu使用SQL Server创建Go应用程序的图文教程

目录一、设置环境1.1、安装 SQL Server1.2、安装 golang1.3、安装 ODBC 驱动程序和 SQL 命令行实用工具 SQL 服务器二、使用 SQL 服务器创建 Go 应用程序2.1、创建连接到 SQL Server 并执
2023-04-12

在Ubuntu使用SQL Server创建Go应用程序的图文教程

这篇文章主要给大家介绍了关于在Ubuntu使用SQL Server创建Go应用程序的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2023-05-15

如何在C++中创建多租户Web应用程序?

在 c++++ 中构建多租户 web 应用程序涉及将每个租户的数据隔离起来。这可以通过两种主要方法实现:使用容器(如无序映射)或使用范围隔离(限制变量的作用域)。容器方法在容器中存储每个租户的数据(键:租户 id,值:租户数据),而范围隔离
如何在C++中创建多租户Web应用程序?
2024-05-11

如何在Java中构建一个JDBC应用程序

这篇文章给大家介绍如何在Java中构建一个JDBC应用程序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页
2023-06-14

C#中怎么创建一个Web应用程序

这期内容当中小编将会给大家带来有关C#中怎么创建一个Web应用程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#创建Web应用程序项目在本节中,创建表示应用程序的用户界面的 Visual C# 或 V
2023-06-17

Django中怎么创建一个新的应用程序

要在Django中创建一个新的应用程序,可以按照以下步骤进行操作:使用以下命令创建一个新的Django应用程序:python manage.py startapp 其中,是新建应用程序的名称。在项目的
Django中怎么创建一个新的应用程序
2024-03-05

Java是一种编程语言,用于创建应用程序和软件。

Java是一种高级编程语言,它可以用于创建应用程序和软件,并因其易学性、可移植性和可靠性而广受欢迎。
Java是一种编程语言,用于创建应用程序和软件。
2024-02-06

怎么在Go中构建Web应用程序

本篇内容介绍了“怎么在Go中构建Web应用程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开始在开始之前,您需要准备好以下几点:已安装Go
2023-07-05

使用C++创建跨平台图形应用程序的最佳实践

创建跨平台图形应用程序的最佳实践:选择跨平台框架:qt、wxwidgets 或 glfw创建可移植代码:使用可移植的 c++++ 标准,避免平台特定代码优化性能:使用硬件加速的图形 api,避免不必要的内存操作,优化布局处理多平台兼容性:使
使用C++创建跨平台图形应用程序的最佳实践
2024-05-12

Java 应用程序中的 PKIX 路径构建失败

PKIX 路径构建失败是由于 Java 应用程序无法构建信任链,验证服务器的证书时发生的错误。这通常是由于以下几个原因导致的:1. 证书链不完整:服务器证书可能缺少中间证书或根证书,导致无法构建完整的信任链。解决方法是确保服务器证书包含完整
2023-09-27

如何用Java多线程在mail中创建Thread对象

这篇文章将为大家详细讲解有关如何用Java多线程在mail中创建Thread对象,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java多线程有很多的知识需要我们学习,在学习的时候还是需要我们
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录