国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在Java應用程序中創建圖像

2019-11-18 15:45:46
字體:
來源:轉載
供稿:網友
合成圖像

  您不必從文件中讀取所有的圖像 — 您可以創建自己的圖像。要創建自己的圖像,最靈活的方法是用一個 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 中的圖像:

在Java應用程序中創建圖像(圖一)
圖 1. BufferedImage 子圖形

  這個圖像是一個以 sPRiteSize 為邊長的正方形。圖像其它部分的尺寸值都與這個邊長相關。實際上這里只有兩個幾何實體,一條線和一個圓,都在不同位置和方向重復出現。假如我們創建一個 Line2D.Double 對象代表線,創建一個 Ellipse2D.Double 對象代表圓,那么我們就可以通過移動用戶坐標系和畫這兩個對象中的一個或其它的對象而畫出整個圖像。

  假如是按真正面向對象的方法,應該定義一個類代表一個子圖形,可能是作為 BufferedImage 的一個子類,但由于我們是在探索使用 BufferedImage 對象的技巧,因此用一個 createSprite() 方法來畫出 BufferedImage 對象上的子圖形會更適合我們的目的。因為該方法只是我們的 applet 類的一個成員,所以我們將為 applet 添加數據成員以存儲任何需要的數據。您可以把我們將使用的數據成員插入到 applet 類中,如下所示:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 即墨市| 千阳县| 达日县| 肃宁县| 琼海市| 剑河县| 宁夏| 无为县| 深州市| 珠海市| 永昌县| 峨山| 东城区| 海原县| 赫章县| 攀枝花市| 元阳县| 眉山市| 沈丘县| 桃江县| 仙桃市| 永泰县| 叶城县| 辛集市| 邵东县| 特克斯县| 电白县| 乳源| 榆社县| 和政县| 元氏县| 科技| 唐山市| 曲水县| 东山县| 广宗县| 儋州市| 鄂温| 平和县| 南澳县| 珠海市|