はじめに
その昔、プログラミングの入門と言えば、スタンドアロンなアプリケーションの作成から入るのが常道でした。が、時代は変わります。インターネット、特にWebの発達により、「初めてのプログラミングがWeb関係だった」という人はずいぶんと多くなりました。
Javaの世界でも、これは顕著です。「初めてJavaに触れる人間が、最初に学ぶのがJSP/サーブレットだった」なんてケースも、今では半ば当たり前になりつつあるようです。が、サーバサイドの開発中心だと、どうしてもなおざりになってしまう分野というのがあります。それは「グラフィック」です。
最近は、Webといえども「テキスト中心の世界」とは言えなくなってきています。グラフィック関連の処理をサーバサイドで行なわなければならない事態は、この先、必ず増えてくることでしょう。そこで、サーバサイドのJavaビギナーに向け、グラフィックの基本利用についてまとめていきましょう。
対象読者
- Javaの基本およびJavaによるWeb開発の基礎(JSP/サーブレット程度)をマスターしている人。
- グラフィック関連のプログラミング経験があまりない人。
- Javaのグラフィック処理を学び直したい人。
グラフィック関連のパッケージとクラス
まず、Javaに用意されているグラフィック関連のクラスについて説明しておきましょう。なお、ここではJ2EE 1.4で使われているJava 5をベースに説明を行います。
- ビットマップイメージに関するクラス
java.awt.Image
java.awt.image.BufferedImage
- グラフィックコンテキスト・クラス
java.awt.Graphics
java.awt.Graphics2D
- イメージの読み書きに関連するクラス
javax.imageio.ImageIO
- イメージ関連のパッケージ
意外とたくさんのクラスやパッケージが用意されているのに驚いたかもしれません。多少はGUIを使った処理を書いたことがあるなら、Image
、BufferedImage
、Graphics
あたりのクラスは知っているかもしれませんね。
この他、イメージファイルに関するものとして、ImageIO
クラスが多用されます。また、java.awt.imageパッケージはBufferedImage
やイメージの処理に関連する各種のクラスを、javax.imageioパッケージはImageIO
やイメージファイルに関連する各種クラスをそれぞれパッケージに持っています。この他、java.awtパッケージ内のColor
やFont
など、イメージ関連の処理で用いられるクラスはたくさんあります。
AWTとSwing
このjava.awtというパッケージは「AWT」と呼ばれるJava標準のGUIフレームワークに関するものです。AWTは「Abstract Winddowing Toolkit」の略で、ウインドウやメニューなどのGUIを使ったプログラムを作成する際に必要となるものがまとめられています。
Javaには、このAWTの他に「Swing」というGUIフレームワークもjavax.swingパッケージとして用意されていますが、グラフィック関係に絞っていえば、基本はAWTと同じでjava.awt内のクラスを利用します。
一度にこれらすべてを理解するのは到底無理でしょうから、まずは最も基本となる「Image
」「BufferedImage
」「Graphics
」の3つのクラスを使った、グラフィックとイメージの基本利用から理解していくのが良いでしょう。また、ここで取り上げるグラフィック関連のクラス類はAWTやSwingといったGUIのパッケージに用意されているものですが、これらのGUIと併用しなければならないというわけではありません。サーバサイドのように、GUIを一切使わないプログラムでも、グラフィック関連の機能だけを利用することは可能です。
一般的なAWTにおけるグラフィックの利用
既にGraphics
クラスの基本ぐらいは分かっている、という人も多いでしょうが、一応、一般的なグラフィックの利用例として、AWTによるGUIを使った、ごく単純なアプレットのソースを上げておきます。赤から青へグラディエーションされたイメージを作成し表示するものです。
package jp.tuyano.codezine; import java.applet.Applet; import java.awt.*; public class SampleApplet extends Applet { private static final long serialVersionUID = 1L; public void paint(Graphics g){ for(int i = 0;i < 16;i++) for(int j = 0;j < 16;j++){ Color c = new Color(i * 16,0,255 - j * 16); g.setColor(c); g.fillRect(i * 16, j * 16, 16, 16); } } }
ここで行なっているのは、「paint
」というメソッドのオーバーライドです。GUI利用のプログラム(AWT、Swingを利用したもの全般)では、利用するコンポーネントやコンテナには必ずこのpaint
メソッドまたはそれに相当するメソッドが用意されています。これは、コンポーネントの表示を更新するとき、必要に応じて呼び出されます。従って、ここに描画に関する処理を用意しておけば、必要があると自動的に実行され画面に表示されるわけです。
この種のメソッドは、一般にjava.awt.Graphics
インスタンスを引数に持ちます(正確には、実はGraphics
ではないのですが……これについては改めて)。Graphics
クラスは、グラフィックコンテキストの描画処理をカプセル化したものです。ここに用意されている描画用のメソッドを呼び出すことで、そのコンポーネントに図形やイメージを描画することができます。従って、AWTなどのGUIプログラムの場合、グラフィックの利用というのは「Graphics
クラスの使い方を覚える」ということであり、それ以外はあまり重要ではありません。
また、基本は「画面への表示」ですから、イメージファイルへのアクセスや、データの送受といった操作はとりあえず不要です。いずれそうしたことを行う必要が生じることでしょうが、単にグラフィックを利用するだけなら、それらの知識はなくとも問題ないのです。