はじめに
AWT(Abstract Window Toolkit)のGraphics
クラスについて、前回、ごく簡単な使い方を説明しました。Graphics
の使い方は非常に簡単です。これは、裏を返せば「複雑なことはできない」ということでもあります。そこで、より高度な描画を行なえるようにGraphics
を拡張して作られたのが「Graphics2D
」なのです。
より本格的なグラフィック処理を行いたいのであれば、このGraphics2D
について理解しておく必要があります。そこで今回は、このGraphics2D
を使った描画の基本について一通り説明を行いましょう。
対象読者
- Javaの基本およびJavaによるWeb開発の基礎(JSP/サーブレット程度)をマスターしている人。
- グラフィック関連のプログラミング経験があまりない人。
- Javaのグラフィック処理を学び直したい人。
Graphics2D利用サーブレットの準備
今回は、特にサーバサイドでの使い方ということに限らず、Javaにおけるグラフィック利用全般に関する話になります。
Graphics2D
の描画は、Graphics
とは少々異なります。Graphics
では、図形を描画するメソッドを使い、描く図形の位置や大きさなどの情報を引数で指定していました。が、Graphics2D
では描画メソッドで図形を指定しません。どうするのかというと「図形の形状を表すオブジェクトを作成し、これを元に描画をする」という方法をとります。
実際に簡単な例を挙げて説明しましょう。今回はいろいろとサンプルを作ることになるので、まず雛形となるサーブレットを用意しておくことにします。SampleGraphics2D
クラスのpaint
メソッドに描画の処理を書けば、それがそのまま表示されるようにしておきます。
package jp.tuyano.codezine; import java.awt.*; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.*; import javax.imageio.stream.ImageOutputStream; import javax.servlet.*; import javax.servlet.http.*; public class SampleGraphics2D extends HttpServlet implements Servlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doAction(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doAction(request, response); } public void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // イメージの作成 BufferedImage im = new BufferedImage(256,256, BufferedImage.TYPE_INT_RGB); Graphics2D g = im.createGraphics(); paint(g); g.dispose(); // イメージの出力 ServletOutputStream sos = null; try { response.setContentType("image/jpeg"); sos = response.getOutputStream(); ImageOutputStream ios = ImageIO.createImageOutputStream(sos); ImageWriter iw = (ImageWriter)ImageIO. getImageWritersByFormatName("jpeg").next(); iw.setOutput(ios); iw.write(im); } catch(IOException ex) { } finally { try { sos.close(); } catch(IOException ex2) {} } } public void paint(Graphics2D g){ // ここに描画処理を用意する } }
<servlet> <description></description> <display-name>SampleGraphics2D</display-name> <servlet-name>SampleGraphics2D</servlet-name> <servlet-class> jp.tuyano.codezine.SampleGraphics2D </servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleGraphics2D</servlet-name> <url-pattern>/graphics2d</url-pattern> </servlet-mapping>
<img src="./graphics2d">