Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Java2Dの座標変換処理について

Java2D APIのドキュメントでは、デフォルトの変換はユーザースペースの72単位が1インチになるようになっているとあります。しかし96dpiの環境では96単位が1インチになっているように思えます。

しかしpaint()で渡されるGraphics2Dコンテキストにある、あるいはGraphicsConfigration.getDefaultTransform()で取得できる初期状態の変換オブジェクトのマトリックスをみても(1 0 0, 0 1 0)と恒等変換になっており、72単位から96単位への変換の情報は入っていないようです。むしろgetNormalizingTransformを連結して始めて72単位で処理されるようです。
これは変換オブジェクトに属する情報自体は、解像度とは関係なく、Java2Dがレンダリング時にデバイスの解像度を基準に変換用の情報を再計算しているということでしょうか?

初心者なので要領を得ない質問かも知れませんが、ご存知の方いらっしゃいましたら教えて頂けたらありがたいです。宜しくお願い致します。

8

回答

8745

閲覧

8件の回答

評価

0

GraphicsConfigrationは個々のデバイスの情報ですから、当然そうでしょう。

評価

0

返答ありがとうございます。

>GraphicsConfigrationは個々のデバイスの情報ですから、当然そうでしょう。

ということであれば取得できる変換オブジェクトのマトリックスは72単位から96単位への変換が考慮されているはずなので初期状態は[[0.75 0 1], [0 0.75 0]]となっていて良い気がするのですが、なぜ恒等変換になっているのでしょうか?
私がすごい勘違いをしているかも知れませんが・・。

評価

0

> 初期状態は[[0.75 0 1], [0 0.75 0]]

間違えました

初期状態は[[1.33.. 0 1], [0 1.33.. 0]]

です。

評価

0

> 変換オブジェクトのマトリックスは72単位か
> ら96単位への変換が考慮されているはずなので
なぜ、そう思うの? 個々の特定のデバイスに関して…???

評価

0

Graphics2D.getDeviceConfiguration()で取得できるGraphicsConfigurationはレンダリング先のデバイスに対する情報なのでそこから取得できるAffineTransformはデバイスの解像度を考慮したスケーリングになっていると思ったのです。
このAffineTransformが持っていないとすると、デバイスの解像度はいつ考慮されるのでしょうか?

評価

0

デフォルトは、その特定のデバイスの特定のコンフィギュレーションだから、96なら96でしょう。そしてgetNormalizingTransform()が72へのトランスフォームを返すのでしょう。ドキュメンテーションには、そう書いてあるようですが。

評価

0

お付き合い頂いてありがとうございます>ranco

> 96なら96でしょう。
デフォルトのAffineTransformがデバイスの解像度を考慮しているとなると、72unitsを1inchへ変換する為にマトリックスのスケールは72/96=1.33..で:
[1.33 0 0]
[0 1.33 0]
となるはずだと思うのです。
しかし実際は
[1 0 0]
[0 1 0]
となっています。なのでデフォルトのAffineTransformは一定して72dpiでの変換でであって、96dpi環境の場合はプラットフォーム依存のアプリケーションで作成した72x72pxの図形と比較して小さくなってしまう気がします。
しかしMacromediaのFireworksで試しに作成した図形とは大きさは一致しているようで・・・混乱しております。

>getNormalizingTransform()が72へのトランスフォームを返すのでしょう
つまりデバイスの解像度を使って72unitsを1inchとなるようにスケーリングするのがgetNormalizingTransformの変換ということでよろしいでしょうか?
getNormalizingTransformのドキュメントにも
"so that 72 units in user space equals 1 inch in device space"とありますし、
実際getNormalizingTransformのAffineTransformのマトリックスは
[1.33 0 0]
[0 1.33 0]
となっているので・・。

評価

0

えーと、だから、デフォルトはそのデバイスのそのコンフィギュレーションのデフォルトだから、96でも111でも44でもしゃーないわけでしょう。正規化(72にする)したいときは、Normalize...を使うということでは。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。