<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>あり &#187; Graphic2D</title>
	<atom:link href="http://blog.4sure.jp/yokoshima/tag/graphic2d/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.4sure.jp/yokoshima</link>
	<description>日常を語る普通の人のブログ</description>
	<lastBuildDate>Tue, 24 Aug 2010 11:49:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.4sure.jp/yokoshima/tag/graphic2d/feed/" />
		<item>
		<title>Graphics2Dに文字列を描画</title>
		<link>http://blog.4sure.jp/yokoshima/2009/07/02/graphics2d%e3%81%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%8f%8f%e7%94%bb/</link>
		<comments>http://blog.4sure.jp/yokoshima/2009/07/02/graphics2d%e3%81%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%8f%8f%e7%94%bb/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 07:24:11 +0000</pubDate>
		<dc:creator>yokoshima</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Graphic2D]]></category>
		<category><![CDATA[LineBreakMeasurer]]></category>

		<guid isPermaLink="false">http://blog.4sure.jp/yokoshima/?p=580</guid>
		<description><![CDATA[Flashでやったらいいじゃないかとは思いますが、画像ファイルに文字列を描画したい場合があります。
単一行の文字列であれば特に何も考えず、
Graphics2D#drawString
すれば良いです。（参考：drawStringメソッド）
しかし複数行にわたる文字列を描画するためには、前述のメソッドでやるには面倒くさい。
現在のy座標の位置と、フォントの高さを計算してさらにどこで文字列を折り返すかもあらかじめ決めておかないと難しい。
そこで、LineBreakMeasurer
というクラスを使用して描画すると多少は簡単になる。
正直、このJavaDocをはじめて見たときはまったく理解出来なかったのですが、
実際やってみると色々わかったことが出てきたのでメモしておきます。
つまりLineBreakMeasurerは、指定した幅に指定した文字列が入りきらなければ（または文の教会と判断したならば）
勝手に行に分割してくれるというものだと思います。
LineBreakMeasurerのコンストラクタに渡すのは

AttributedStringの反復子
BreakIterator
FontRenderContext

の三つを抑えておけば大丈夫そうです。
AttributedStringには、描画する文字情報を保持させます。TextAttribute
に設定出来る情報があります。
BreakIteratorには、文を分割する境界に関する情報を持たせます。
LineBreakMeasurerでこれを指定しないコンストラクタを使用すると、BreakIterator#getLineInstance()
が使用されるようです。文字を一杯一杯に出したいときは、BreakIterator#getCharacterInstance()
を使用すると良いです。
FontRenderContextは、Graphics2D#getFontRenderContext()
を指定しておけば良いです。実際どう効いてくるのかは未調査です。
行分割出来たらセンタリングと右寄せとか位置を調整したくなってくるのですが、
フォントアセント、フォントディセント、レディング等を考えないといけないのですが、
（アセント、ディセント等はフォントのコンセプトが割と分かりやすいです。）
とりあえず、いいサンプルがあったのでそれを参考にします。
LineBreakMeasurer: getPosition()
LineBreakMeasurer#nextLayout(float)
を呼ぶと次の分割単位（ここでは行を想定）を返します。
行が変わり、描画直前でアセントを設定し、描画し終わったらディセント、レディングを追加します。
ただし、ここまでは良かったのですが、垂直の位置をセンタリングや下寄せにしたい場合はどうしようか？
という問題が出てきました。現状のアイデアとしては、LineBreakMeasurerを最後の行から上に向かって描けば良さそうですがまだ未検証。
こちらも参考にさせていただきました。
Javaで複数行の文字列をレンダリングするときの注意点




]]></description>
			<content:encoded><![CDATA[<p>Flashでやったらいいじゃないかとは思いますが、画像ファイルに文字列を描画したい場合があります。<br />
単一行の文字列であれば特に何も考えず、<br />
<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/awt/Graphics2D.html#drawString(java.lang.String, float, float)">Graphics2D#drawString</a><br />
すれば良いです。（参考：<a href="http://www.javadrive.jp/java2d/string/index1.html">drawStringメソッド</a>）</p>
<p>しかし複数行にわたる文字列を描画するためには、前述のメソッドでやるには面倒くさい。<br />
現在のy座標の位置と、フォントの高さを計算してさらにどこで文字列を折り返すかもあらかじめ決めておかないと難しい。</p>
<p>そこで、<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/font/LineBreakMeasurer.html">LineBreakMeasurer</a><br />
というクラスを使用して描画すると多少は簡単になる。<br />
正直、このJavaDocをはじめて見たときはまったく理解出来なかったのですが、<br />
実際やってみると色々わかったことが出てきたのでメモしておきます。</p>
<p>つまりLineBreakMeasurerは、指定した幅に指定した文字列が入りきらなければ（または文の教会と判断したならば）<br />
勝手に行に分割してくれるというものだと思います。</p>
<p>LineBreakMeasurerのコンストラクタに渡すのは</p>
<ul>
<li><a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/text/AttributedString.html">AttributedString</a>の反復子</li>
<li><a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/text/BreakIterator.html">BreakIterator</a></li>
<li><a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/font/FontRenderContext.html">FontRenderContext</a></li>
</ul>
<p>の三つを抑えておけば大丈夫そうです。<br />
AttributedStringには、描画する文字情報を保持させます。<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/font/TextAttribute.html">TextAttribute</a><br />
に設定出来る情報があります。<br />
BreakIteratorには、文を分割する境界に関する情報を持たせます。<br />
LineBreakMeasurerでこれを指定しないコンストラクタを使用すると、<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/text/BreakIterator.html#getLineInstance()">BreakIterator#getLineInstance()</a><br />
が使用されるようです。文字を一杯一杯に出したいときは、<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/text/BreakIterator.html#getCharacterInstance()">BreakIterator#getCharacterInstance()</a><br />
を使用すると良いです。<br />
FontRenderContextは、<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/Graphics2D.html#getFontRenderContext()">Graphics2D#getFontRenderContext()</a><br />
を指定しておけば良いです。実際どう効いてくるのかは未調査です。</p>
<p>行分割出来たらセンタリングと右寄せとか位置を調整したくなってくるのですが、<br />
フォントアセント、フォントディセント、レディング等を考えないといけないのですが、<br />
（アセント、ディセント等は<a href="http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/2d/spec/j2d-fonts.html#wp62220">フォントのコンセプト</a>が割と分かりやすいです。）<br />
とりあえず、いいサンプルがあったのでそれを参考にします。</p>
<p><a href="http://www.java2s.com/Code/JavaAPI/java.awt.font/LineBreakMeasurergetPosition.htm">LineBreakMeasurer: getPosition()</a></p>
<p><a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/font/LineBreakMeasurer.html#nextLayout(float)">LineBreakMeasurer#nextLayout(float)</a><br />
を呼ぶと次の分割単位（ここでは行を想定）を返します。<br />
行が変わり、描画直前でアセントを設定し、描画し終わったらディセント、レディングを追加します。</p>
<p>ただし、ここまでは良かったのですが、垂直の位置をセンタリングや下寄せにしたい場合はどうしようか？<br />
という問題が出てきました。現状のアイデアとしては、LineBreakMeasurerを最後の行から上に向かって描けば良さそうですがまだ未検証。</p>
<p>こちらも参考にさせていただきました。<br />
<a href="http://d.hatena.ne.jp/jbking/20071017/p1">Javaで複数行の文字列をレンダリングするときの注意点</a>
<p><script type="text/javascript"><!--
google_ad_client = "pub-3467153506120319";
/* 468x60, 作成済み 09/05/08 */
google_ad_slot = "8443402396";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4sure.jp/yokoshima/2009/07/02/graphics2d%e3%81%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%8f%8f%e7%94%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.4sure.jp/yokoshima/2009/07/02/graphics2d%e3%81%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%8f%8f%e7%94%bb/" />
	</item>
		<item>
		<title>gif画像のリサイズ</title>
		<link>http://blog.4sure.jp/yokoshima/2009/06/30/gif%e7%94%bb%e5%83%8f%e3%81%ae%e3%83%aa%e3%82%b5%e3%82%a4%e3%82%ba/</link>
		<comments>http://blog.4sure.jp/yokoshima/2009/06/30/gif%e7%94%bb%e5%83%8f%e3%81%ae%e3%83%aa%e3%82%b5%e3%82%a4%e3%82%ba/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 14:40:33 +0000</pubDate>
		<dc:creator>yokoshima</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[gif]]></category>
		<category><![CDATA[Graphic2D]]></category>
		<category><![CDATA[ImageIO]]></category>
		<category><![CDATA[透過]]></category>

		<guid isPermaLink="false">http://blog.4sure.jp/yokoshima/?p=456</guid>
		<description><![CDATA[透過色のあるgif画像の出力
で、透過色付きgif画像の出力は出来たが、出力したgifファイルをリサイズする必要が出てきました。
これを実現するには、アフィン変換（アフィン写像参照）という考え方を使って行うらしい。
アフィーンというかギャフンという感じだ。
実装はAffineTransformOpを使って元イメージをフィルタさせるらしい。

このクラスは、アフィン変換を使用して、ソースのイメージまたは Raster の 2 次元座標からデスティネーションのイメージまたは Raster の 2 次元座標への線形マッピングを実行します。使用される補間のタイプは、コンストラクタを介して、RenderingHints オブジェクトまたはこのクラスで定義されている整数型補間タイプのうちの 1 つによって指定されます。

それにしてもいつもすごく分かりにくい説明ですね。
ちなみに、java.awt.imageパッケージのxxxxOpというクラスは、操作対象があって、その対象に対しての操作が出来るモノらしいです。
AffineTransformOpは、文字通りアフィン変換を対象に対して行うものです。
アフィン変換にはいくつか種類があって、リサイズということは拡大縮小（スケーリング）なので、その内容を指定して
AffineTransformを引数として
AffineTransformOpに渡します。
AffineTransformは、スケーリング変換の場合AffineTransform#getScaleInstanceで
取得できますが、この引数はリサイズ後のサイズではなく、元画像とリサイズ後画像の比率（リサイズ後画像/元画像）を指定します。

	//比率を出す
	double resizeWidthRatio = &#40;double&#41;resizeWidth / &#40;double&#41;src.getWidth&#40;&#41;;
	double resizeHeightRatio = &#40;double&#41;resizeHeight / &#40;double&#41;src.getHeight&#40;&#41;;
&#160;
	AffineTransform at = AffineTransform.getScaleInstance&#40;resizeWidthRatio, resizeHeightRatio&#41;;
	AffineTransformOp atOp = new AffineTransformOp&#40;at, AffineTransformOp.TYPE_BICUBIC&#41;;

このAffineTransformOpの第二引数には以下の3つのどれかを指定します。


TYPE_BICUBIC


TYPE_BILINEAR


TYPE_NEAREST_NEIGHBOR


バイキュービック法によると、TYPE_BICUBICを選択するのが画質が良さそう。
しかし、これでgifファイルを書き込みしても透過されてくれないので、自力でやる必要がある。
記事が埋もれそうなので次回に。




]]></description>
			<content:encoded><![CDATA[<p><a>透過色のあるgif画像の出力</a><br />
で、透過色付きgif画像の出力は出来たが、出力したgifファイルをリサイズする必要が出てきました。</p>
<p>これを実現するには、アフィン変換（<a href="http://ja.wikipedia.org/wiki/アフィン写像">アフィン写像</a>参照）という考え方を使って行うらしい。<br />
アフィーンというかギャフンという感じだ。</p>
<p>実装は<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/image/AffineTransformOp.html">AffineTransformOp</a>を使って元イメージをフィルタさせるらしい。</p>
<blockquote><p>
このクラスは、アフィン変換を使用して、ソースのイメージまたは Raster の 2 次元座標からデスティネーションのイメージまたは Raster の 2 次元座標への線形マッピングを実行します。使用される補間のタイプは、コンストラクタを介して、RenderingHints オブジェクトまたはこのクラスで定義されている整数型補間タイプのうちの 1 つによって指定されます。
</p></blockquote>
<p>それにしてもいつもすごく分かりにくい説明ですね。</p>
<p>ちなみに、java.awt.imageパッケージのxxxxOpというクラスは、操作対象があって、その対象に対しての操作が出来るモノらしいです。<br />
AffineTransformOpは、文字通りアフィン変換を対象に対して行うものです。</p>
<p>アフィン変換にはいくつか種類があって、リサイズということは拡大縮小（スケーリング）なので、その内容を指定して<br />
<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/AffineTransform.html">AffineTransform</a>を引数として<br />
AffineTransformOpに渡します。</p>
<p>AffineTransformは、スケーリング変換の場合<a href="http://72.5.124.55/javase/ja/6/docs/ja/api/java/awt/geom/AffineTransform.html#getScaleInstance(double, double)">AffineTransform#getScaleInstance</a>で<br />
取得できますが、この引数はリサイズ後のサイズではなく、元画像とリサイズ後画像の比率（リサイズ後画像/元画像）を指定します。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;">//比率を出す</span>
	<span style="color: #000066; font-weight: bold;">double</span> resizeWidthRatio <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span><span style="color: #009900;">&#41;</span>resizeWidth <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span><span style="color: #009900;">&#41;</span>src.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">double</span> resizeHeightRatio <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span><span style="color: #009900;">&#41;</span>resizeHeight <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span><span style="color: #009900;">&#41;</span>src.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003399;">AffineTransform</span> at <span style="color: #339933;">=</span> <span style="color: #003399;">AffineTransform</span>.<span style="color: #006633;">getScaleInstance</span><span style="color: #009900;">&#40;</span>resizeWidthRatio, resizeHeightRatio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">AffineTransformOp</span> atOp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">AffineTransformOp</span><span style="color: #009900;">&#40;</span>at, <span style="color: #003399;">AffineTransformOp</span>.<span style="color: #006633;">TYPE_BICUBIC</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>このAffineTransformOpの第二引数には以下の3つのどれかを指定します。</p>
<ul>
<li>
<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/image/AffineTransformOp.htmll#TYPE_BICUBIC">TYPE_BICUBIC</a>
</li>
<li>
<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/image/AffineTransformOp.html#TYPE_BILINEAR">TYPE_BILINEAR</a>
</li>
<li>
<a href="http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/image/AffineTransformOp.html#TYPE_NEAREST_NEIGHBOR">TYPE_NEAREST_NEIGHBOR</a>
</li>
</ul>
<p><a href="http://yougo.ascii.jp/caltar/%E3%83%90%E3%82%A4%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%93%E3%83%83%E3%82%AF%E6%B3%95">バイキュービック法</a>によると、TYPE_BICUBICを選択するのが画質が良さそう。</p>
<p>しかし、これでgifファイルを書き込みしても透過されてくれないので、自力でやる必要がある。<br />
記事が埋もれそうなので次回に。
<p><script type="text/javascript"><!--
google_ad_client = "pub-3467153506120319";
/* 468x60, 作成済み 09/05/08 */
google_ad_slot = "8443402396";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4sure.jp/yokoshima/2009/06/30/gif%e7%94%bb%e5%83%8f%e3%81%ae%e3%83%aa%e3%82%b5%e3%82%a4%e3%82%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.4sure.jp/yokoshima/2009/06/30/gif%e7%94%bb%e5%83%8f%e3%81%ae%e3%83%aa%e3%82%b5%e3%82%a4%e3%82%ba/" />
	</item>
		<item>
		<title>透過色のあるgif画像の出力</title>
		<link>http://blog.4sure.jp/yokoshima/2009/06/23/%e9%80%8f%e9%81%8e%e8%89%b2%e3%81%ae%e3%81%82%e3%82%8bgif%e7%94%bb%e5%83%8f%e3%81%ae%e5%87%ba%e5%8a%9b/</link>
		<comments>http://blog.4sure.jp/yokoshima/2009/06/23/%e9%80%8f%e9%81%8e%e8%89%b2%e3%81%ae%e3%81%82%e3%82%8bgif%e7%94%bb%e5%83%8f%e3%81%ae%e5%87%ba%e5%8a%9b/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 10:11:36 +0000</pubDate>
		<dc:creator>yokoshima</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[gif]]></category>
		<category><![CDATA[Graphic2D]]></category>
		<category><![CDATA[出力]]></category>
		<category><![CDATA[透過色]]></category>

		<guid isPermaLink="false">http://blog.4sure.jp/yokoshima/?p=432</guid>
		<description><![CDATA[gifイメージの出力の続きです。
「透過色」「gif」「java」で検索してもそのものの答えが出なかったのですが、
今日、ついに決着がついたのでメモしておきます。
1. BufferedImageの生成
BufferedImageはBufferedImage.TYPE_BYTE_INDEXEDで作成します。
カラーモデルを指定するコンストラクタです。

BufferedImage(int, int, int, java.awt.image.IndexColorModel)

ですね。第4引数のIndexColorModelは

BufferedImage(int, int, int)
のソースのTYPE_BYTE_INDEXEDの所から引用させていただいて、以下のように作成しました。

private IndexColorModel createIndexColorModel&#40;&#41;&#123;
        // Create a 6x6x6 color cube
        int&#91;&#93; cmap = new int&#91;256&#93;;
        int i=0;
        for &#40;int r=0; r &#60; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.4sure.jp/yokoshima/2009/06/11/gif%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%81%ae%e5%87%ba%e5%8a%9b/">gifイメージの出力</a>の続きです。</p>
<p>「透過色」「gif」「java」で検索してもそのものの答えが出なかったのですが、<br />
今日、ついに決着がついたのでメモしておきます。</p>
<h4>1. BufferedImageの生成</h4>
<p>BufferedImageはBufferedImage.TYPE_BYTE_INDEXEDで作成します。<br />
カラーモデルを指定するコンストラクタです。<br />
<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/image/BufferedImage.html#BufferedImage(int, int, int, java.awt.image.IndexColorModel)"><br />
BufferedImage(int, int, int, java.awt.image.IndexColorModel)<br />
</a><br />
ですね。第4引数のIndexColorModelは<br />
<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/image/BufferedImage.html#BufferedImage(int, int, int)"><br />
BufferedImage(int, int, int)<br />
</a>のソースのTYPE_BYTE_INDEXEDの所から引用させていただいて、以下のように作成しました。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">IndexColorModel</span> createIndexColorModel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Create a 6x6x6 color cube</span>
        <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> cmap <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">256</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> r<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> r <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">256</span><span style="color: #339933;">;</span> r <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">51</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> g<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> g <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">256</span><span style="color: #339933;">;</span> g <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">51</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> b<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> b <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">256</span><span style="color: #339933;">;</span> b <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">51</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    cmap<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>r<span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span>g<span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span>b<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// And populate the rest of the cmap with gray values</span>
        <span style="color: #000066; font-weight: bold;">int</span> grayIncr <span style="color: #339933;">=</span> <span style="color: #cc66cc;">256</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">256</span><span style="color: #339933;">-</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// The gray ramp will be between 18 and 252</span>
        <span style="color: #000066; font-weight: bold;">int</span> gray <span style="color: #339933;">=</span> grayIncr<span style="color: #339933;">*</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">256</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            cmap<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>gray<span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span>gray<span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span>gray<span style="color: #339933;">;</span>
            gray <span style="color: #339933;">+=</span> grayIncr<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IndexColorModel</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">256</span>, cmap, <span style="color: #cc66cc;">0</span>, <span style="color: #000066; font-weight: bold;">true</span>, <span style="color: #cc66cc;">215</span>,
                                         <span style="color: #003399;">DataBuffer</span>.<span style="color: #006633;">TYPE_BYTE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>元ソースと違うところは、最後のIndexColoeModelを生成する所で、第5引数（hasAlpha）にtrue、<br />
第6引数に透過色とする為のインデックス番号を指定している所です。<br />
（IndexColorModelのコンストラクタ<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/image/IndexColorModel.html#IndexColorModel(int, int, int[], int, boolean, int, int)">IndexColorModel(int, int, int[], int, boolean, int, int)</a>）</p>
<p>処理の最初のほうでcmapという変数に色を詰め込んでいますが、この場合は215番目が白(0xffffff = 16777215)になります。<br />
白を透過色とする場合です。<br />
これはコンストラクタかユーティリティを用意して欲しいところですね。</p>
<h4>2. Graphics2Dの生成</h4>
<p>そのBufferedImageからGraphics2Dを生成します。<br />
生成して色々設定していきますが、gif出力の場合、描画のアンチエイリアス設定をすると白背景にしたつもりが真っ黒になってしまいます。<br />
pngで出力する場合は描画のアンチエイリアス設定をしても問題ありません。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #003399;">BufferedImage</span> b <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span>  <span style="color: #003399;">BufferedImage</span><span style="color: #009900;">&#40;</span>width, height, <span style="color: #003399;">BufferedImage</span>.<span style="color: #006633;">TYPE_BYTE_INDEXED</span>, createIndexColorModel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">Graphics2D</span> g <span style="color: #339933;">=</span> b.<span style="color: #006633;">createGraphics</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">Map</span> renderingHints <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//描画のアンチエイリアス</span>
<span style="color: #666666; font-style: italic;">//		renderingHints.put(RenderingHints.KEY_ANTIALIASING,</span>
<span style="color: #666666; font-style: italic;">//				RenderingHints.VALUE_ANTIALIAS_ON);</span>
	<span style="color: #666666; font-style: italic;">//文字描画のアンチエイリアス</span>
	renderingHints.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">KEY_TEXT_ANTIALIASING</span>,
			<span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">VALUE_TEXT_ANTIALIAS_ON</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//描画ヒントキー</span>
	renderingHints.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">KEY_RENDERING</span>,
			<span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">VALUE_RENDER_QUALITY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//アルファ補完</span>
	renderingHints.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">KEY_ALPHA_INTERPOLATION</span>,
			<span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">VALUE_ALPHA_INTERPOLATION_QUALITY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	g.<span style="color: #006633;">setRenderingHints</span><span style="color: #009900;">&#40;</span>renderingHints<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	g.<span style="color: #006633;">setComposite</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AlphaComposite</span>.<span style="color: #006633;">Clear</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	g.<span style="color: #006633;">fillRect</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, width, height<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	g.<span style="color: #006633;">setComposite</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AlphaComposite</span>.<span style="color: #006633;">SrcOver</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">:</span></pre></div></div>

<p>また、AlphaCompositeのClearを設定、塗りつぶし、AlphaCompositeのSrcOver設定を順番にやります。<br />
この後に内容を描画していきます。</p>
<h4>3. gifファイル出力</h4>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> writeImage<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> outputFile, <span style="color: #003399;">BufferedImage</span> image<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">File</span> file <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span>outputFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ImageOutputStream ios <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	ImageWriter iw <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		ios <span style="color: #339933;">=</span> ImageIO.<span style="color: #006633;">createImageOutputStream</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		iw <span style="color: #339933;">=</span> ImageIO.<span style="color: #006633;">getImageWritersByFormatName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;gif&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		iw.<span style="color: #006633;">setOutput</span><span style="color: #009900;">&#40;</span>ios<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		iw.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Exception</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ファイル作成に失敗しました&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
		iw.<span style="color: #006633;">dispose</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			ios.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Exception</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ファイルのClose処理に失敗しました&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>描画内容の色が白にあまりにも近い場合（今回は0xfffffeで試した）ら、白に滅色されてしまっているのか、<br />
出力されませんでした。<br />
可能であれば<a href="http://e-words.jp/p/r-websafecolor.html">Webセーフカラー</a>にあわせておいたら確実でしょう。
<p><script type="text/javascript"><!--
google_ad_client = "pub-3467153506120319";
/* 468x60, 作成済み 09/05/08 */
google_ad_slot = "8443402396";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4sure.jp/yokoshima/2009/06/23/%e9%80%8f%e9%81%8e%e8%89%b2%e3%81%ae%e3%81%82%e3%82%8bgif%e7%94%bb%e5%83%8f%e3%81%ae%e5%87%ba%e5%8a%9b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.4sure.jp/yokoshima/2009/06/23/%e9%80%8f%e9%81%8e%e8%89%b2%e3%81%ae%e3%81%82%e3%82%8bgif%e7%94%bb%e5%83%8f%e3%81%ae%e5%87%ba%e5%8a%9b/" />
	</item>
		<item>
		<title>Javaでイメージ描画 2</title>
		<link>http://blog.4sure.jp/yokoshima/2009/05/26/java%e3%81%a7%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e6%8f%8f%e7%94%bb-2/</link>
		<comments>http://blog.4sure.jp/yokoshima/2009/05/26/java%e3%81%a7%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e6%8f%8f%e7%94%bb-2/#comments</comments>
		<pubDate>Tue, 26 May 2009 02:58:03 +0000</pubDate>
		<dc:creator>yokoshima</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Graphic2D]]></category>

		<guid isPermaLink="false">http://blog.4sure.jp/yokoshima/?p=153</guid>
		<description><![CDATA[書く場所が確保出来たら、単純なラインを引いてみます。
java.awt.Graphics
にはdrawLine(int, int, int, int)
というメソッドがあるのですが、ぱっと見ただけでは引数がなんなのかわからないので、別の方法で書きます。
直線をあらわすクラスにjava.awt.geom.Line2D
というクラスがあります。個人的には前述のメソッドよりも理解しやすいので、これで作成します。

BufferedImage image = new BufferedImage&#40;500, 500, BufferedImage.TYPE_INT_ARGB&#41;;
Graphics2d gdImage = image.createGraphics&#40;&#41;;
&#160;
Point start = new Point&#40;0, 0&#41;;
Point end = new Point&#40;500, 500&#41;;
&#160;
Line2D line = new Lind2D.Float&#40;start, end&#41;;
&#160;
gdImage.setPaint&#40;Color.BLUE&#41;;
gdImage.setStroke&#40;new BasicStroke&#40;&#41;&#41;;
gdImage.draw&#40;line&#41;;

Pointクラスは、1点の座標を
表すクラスでx, y座標をバラバラに管理するよりかは効率的でしょう。
その後、どんな色で、どんな形状で（線なら実線とか破線とか）を指定してあげます。
これらの属性は、セットしたら変更されるまでずっと持っている属性ですので、
たとえば青色の実線を描いた後に赤色の破線を描きたい場合は、描画の前にセットしなおします。

gdImage.setPaint&#40;Color.BLUE&#41;;
gdImage.setStroke&#40;new BasicStroke&#40;&#41;&#41;;
gdImage.draw&#40;line&#41;;
&#160;
gdImage.setPaint&#40;Color.RED&#41;;
gdImage.setStroke&#40;new BasicStroke&#40;1, BasicStroke.JOIN_BEVEL, BasicStroke.CAP_BUTT&#41;&#41;;
gdImage.draw&#40;line&#41;;

結局、直線の場合はLine2Dオブジェクトを操作したように、同じようにして以下のような形状の形を描画することが出来ます。
四角形：Rectangle2D
角丸四角形：RoundRectangle2D
楕円：Ellipse2D
弧：Arc2D
3次曲線セグメント：CubicCurve2D
2次曲線セグメント:QuadCurve2D
そういえば正円とか八角形とかはどうするんだ？と思ったので勉強してきます。
続きます（たぶん）




]]></description>
			<content:encoded><![CDATA[<p>書く場所が確保出来たら、単純なラインを引いてみます。<br />
<a>java.awt.Graphics</a><br />
には<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/Graphics.html#drawLine(int, int, int, int)">drawLine(int, int, int, int)</a><br />
というメソッドがあるのですが、ぱっと見ただけでは引数がなんなのかわからないので、別の方法で書きます。</p>
<p>直線をあらわすクラスに<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/Line2D.html">java.awt.geom.Line2D</a><br />
というクラスがあります。個人的には前述のメソッドよりも理解しやすいので、これで作成します。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">BufferedImage</span> image <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedImage</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">500</span>, <span style="color: #cc66cc;">500</span>, <span style="color: #003399;">BufferedImage</span>.<span style="color: #006633;">TYPE_INT_ARGB</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Graphics2d gdImage <span style="color: #339933;">=</span> image.<span style="color: #006633;">createGraphics</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">Point</span> start <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Point</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">Point</span> end <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Point</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">500</span>, <span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">Line2D</span> line <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Lind2D.<span style="color: #003399;">Float</span><span style="color: #009900;">&#40;</span>start, end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
gdImage.<span style="color: #006633;">setPaint</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Color</span>.<span style="color: #006633;">BLUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gdImage.<span style="color: #006633;">setStroke</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BasicStroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gdImage.<span style="color: #006633;">draw</span><span style="color: #009900;">&#40;</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/Point.html">Point</a>クラスは、1点の座標を<br />
表すクラスでx, y座標をバラバラに管理するよりかは効率的でしょう。<br />
その後、どんな色で、どんな形状で（線なら実線とか破線とか）を指定してあげます。<br />
これらの属性は、セットしたら変更されるまでずっと持っている属性ですので、<br />
たとえば青色の実線を描いた後に赤色の破線を描きたい場合は、描画の前にセットしなおします。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">gdImage.<span style="color: #006633;">setPaint</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Color</span>.<span style="color: #006633;">BLUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gdImage.<span style="color: #006633;">setStroke</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BasicStroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gdImage.<span style="color: #006633;">draw</span><span style="color: #009900;">&#40;</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
gdImage.<span style="color: #006633;">setPaint</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Color</span>.<span style="color: #006633;">RED</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gdImage.<span style="color: #006633;">setStroke</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BasicStroke</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #003399;">BasicStroke</span>.<span style="color: #006633;">JOIN_BEVEL</span>, <span style="color: #003399;">BasicStroke</span>.<span style="color: #006633;">CAP_BUTT</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gdImage.<span style="color: #006633;">draw</span><span style="color: #009900;">&#40;</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>結局、直線の場合はLine2Dオブジェクトを操作したように、同じようにして以下のような形状の形を描画することが出来ます。<br />
四角形：<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/Rectangle2D.html">Rectangle2D</a><br />
角丸四角形：<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/RoundRectangle2D.html">RoundRectangle2D</a><br />
楕円：<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/Ellipse2D.html">Ellipse2D</a><br />
弧：<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/Arc2D.html">Arc2D</a><br />
3次曲線セグメント：<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/CubicCurve2D.html">CubicCurve2D</a><br />
2次曲線セグメント:<a href="http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/geom/QuadCurve2D.html">QuadCurve2D</a></p>
<p>そういえば正円とか八角形とかはどうするんだ？と思ったので勉強してきます。<br />
続きます（たぶん）
<p><script type="text/javascript"><!--
google_ad_client = "pub-3467153506120319";
/* 468x60, 作成済み 09/05/08 */
google_ad_slot = "8443402396";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4sure.jp/yokoshima/2009/05/26/java%e3%81%a7%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e6%8f%8f%e7%94%bb-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.4sure.jp/yokoshima/2009/05/26/java%e3%81%a7%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e6%8f%8f%e7%94%bb-2/" />
	</item>
	</channel>
</rss>
