• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JSP > Java应用程序中创建图像

Java应用程序中创建图像

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了已阻止java应用程序,java应用程序,应用程序被java阻止,应用程序已被java阻止,java应用程序错误等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
合成图像

  您不必从文件中读取所有的图像 — 您可以创建自己的图像。要创建自己的图像,最灵活的方法是用一个 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

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 为Java应用程序添加退出事件响应
  • Java应用程序中创建图像

相关文章

  • 2017-05-11jsp文件上传与下载实例代码
  • 2017-05-11JSP自定义标签基础知识学习
  • 2017-05-11基于jsp:included的使用与jsp:param乱码的解决方法
  • 2017-05-11JSP由浅入深(3)—— 通过表达式增加动态内容
  • 2017-05-11二、设置开发、运行环境
  • 2017-05-11jsp内置对象
  • 2017-05-11JSP自定义标签案例分析
  • 2017-05-11使用MongoDB和JSP实现一个简单的购物车系统实例
  • 2017-05-11JDBC 入门(二)
  • 2017-05-11jsp计数器代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 通用大型网站页面静态化解决方案
    • Spring MVC中上传文件实例
    • jsp中文乱码 jsp mysql 乱码的解决方法
    • img的src地址是一个请求的方式来显示图片方法
    • Java多线程编程之限制优先级
    • JSP使用MVC模式完成删除和修改功能实例详解
    • 配置Web应用环境实现JSP留言簿
    • J2EE 开发购物网站 经验篇 - 建表
    • log4j 文件输出
    • JSP教程之使用JavaBean完成业务逻辑的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有