- PR -

画像の縮小について

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-02 20:24
unibon です。こんにちわ。

画像ライブラリーのことは良くは知りませんが、どうやらおちゃさんはかなりの高画質を求められているのですよね。a-sanさんのご回答の中で提示されたプログラムを Windows 98 + JDK 1.4.2 で動かしてみましたが、一般向けのサムネールとしては十分な画質に見えます。
#最初は、プラットフォームが違ったりすると、とても低品質の縮小になるとか、そういう話かと推測していました。

しかし、コントラストが強い境界線が、水平線や垂直線から少しだけ傾いていると、たしかにおっしゃるようなジャギーが目立ちますね。逆に、コントラストが弱かったり、角度が45度に近いとジャギーは目立たないようです。
Windows 98 の拡大鏡で見てみましたが、どうやらガンマ値とかそういった要因のような気がします。
たとえば、

□□□□□□□□□□□□□□□■■■■■
□□□□□□□□□□■■■■■■■■■■
□□□□□■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■

のような斜線を、アンチエイリアスするときに、理想的には、

00000000000123455555
00000012345555555555
01234555555555555555
55555555555555555555

のようにすると良いと思います(数字の大きさが黒さを示します)が、これが、

00000000000002455555
00000000245555555555
00024555555555555555
55555555555555555555

のような感じになっていて、階調を十分に使いこなしていないような感じがします。
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-04-02 20:37
うーむ。
こちらは、Windows2000, J2SDK 1.4.2_01です。
確か、WindowsXPでもうまくいけてました。
拡大してみると、ちゃんと元の画像の数画素分の色が混ざって、
中間色になっているのがわかります。
Hintsを無効にしてみると、こんどは単純に間引かれているので、
Hintsが機能していることもわかります。
GDI+は知らないのですが、もっとすごいクオリティを求めているのでしょうか?
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-04-04 01:53
unibonさん、a-sanさん、いろいろ考えてくださってありがとうございます。

クオリティ的には、わりと普通レベルだとおもっています。
というのは、前の話に出ていた GDI+ というのはWindowsXPに標準で入っている描画用のコンポーネントです。
ですから、WindowsXPで画像ファイルの入っているフォルダを開くとサムネイルが表示されますよね。
あの程度のクオリティでよいのです。

いろいろ考えると、なんだかHintsの設定が反映されていない気がするのです。
(目視で感じているだけので、このへん再検証の必要があるかもしれません)

環境とか関係あるのでしょうか…。
マシン、OS、J2SDK の各種バージョンで検証・調査してみます。

最悪、スケーリングの自前実装も視野に入れつつ、調査してみます。
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-04-04 06:20
WindowsXP SP2
J2SDK 1.4.1_07

java version "1.5.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
Java HotSpot(TM) Client VM (build 1.5.0_01-b08, mixed mode, sharing)

別のマシンでa-sanさんのプログラムを動かしてみました。
やはり状況は変わりませんでした。
出力された画像をPhotoShopで拡大してみたのですが
Hintsが指定されているもの。Hintsの指定をコメントアウトしたもの。
を比べてみたところ、両者は変わりがないようでした。
Hintsの指定が無視されているようです。

先日試したマシンとの共通項は
OS が WindowsXP SP2
java version が "1.5.0_01"
です。

J2SDK と Runtime のバージョンが違っているのがまずいのかな…。
継続調査します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-04-04 09:40
unibon です。こんにちわ。

引用:

おちゃさんの書き込み (2005-04-04 06:20) より:
出力された画像をPhotoShopで拡大してみたのですが
Hintsが指定されているもの。Hintsの指定をコメントアウトしたもの。
を比べてみたところ、両者は変わりがないようでした。
Hintsの指定が無視されているようです。


試してみたのですが、scale が小さすぎる(たとえば0.25位)と Hints が効かないようですが、scale が大きめ(0.5以上)ならば、Hints は目に見えて効くような感じです。おちゃさんの環境で scale を大きめにしても Hints は効かないでしょうか?もし大き目の scale でなら Hints が効くようならば、やっぱりライブラリー(Java2D)の性能(?)なのかもしれません。
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-04-04 17:40
unibonさん、試してくれてありがとございます。

私の環境でも、unibonさんのおっしゃるとおり、scaleが大きめ(0.5以上)だと、非常にきれいな出力が得られています。
目標としているscale = 0.3 ぐらいの出力を得ようとするとHintsが効いていません。

やはりライブラリの仕様なのか…。

J2SDKを入れなおしたり、別のOSで試したり、いろいろな環境で検証してみたのですが、変化はありませんでした。Javaの理念からいえば、ある意味当然なのですが。

今後は「別のライブラリを試してみる or 自分で実装」の方向で検証してみます。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-04 17:50
ふーん、scale = 0.5 ならうまくいくんだ?

scale 0.3 = √0.3 * √0.3 = 0.54 * 0.54

scale = 0.54 で 2回縮小するんじゃだめかね?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-04-04 18:52
もしかして、Graphics#drawImage()に対してはRenderingHintは効かなかったりしませんか?
ラスタ画像の縮小再描画ではなくて、draw(),fill()等を使用したベクトル描画を行えば、
アンチエイリアス等のRenderingHintの効果があったりしません?

昔その辺をいじったとき、私の環境(Win2000+JDK1.3だったかな)では、ベクトル描画命令
ならきれいにアンチエイリアスしてくれていたので…
その発想で行くと、Apache-Batikを使用してSVGフォーマットで定義したベクトル画像を
描画、なんてのも良いのかもしれません。

[ メッセージ編集済み 編集者: シュン 編集日時 2005-04-04 18:55 ]

スキルアップ/キャリアアップ(JOB@IT)