- - PR -
画像の縮小について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 のような感じになっていて、階調を十分に使いこなしていないような感じがします。 | ||||
|
投稿日時: 2005-04-02 20:37
うーむ。
こちらは、Windows2000, J2SDK 1.4.2_01です。 確か、WindowsXPでもうまくいけてました。 拡大してみると、ちゃんと元の画像の数画素分の色が混ざって、 中間色になっているのがわかります。 Hintsを無効にしてみると、こんどは単純に間引かれているので、 Hintsが機能していることもわかります。 GDI+は知らないのですが、もっとすごいクオリティを求めているのでしょうか? | ||||
|
投稿日時: 2005-04-04 01:53
unibonさん、a-sanさん、いろいろ考えてくださってありがとうございます。
クオリティ的には、わりと普通レベルだとおもっています。 というのは、前の話に出ていた GDI+ というのはWindowsXPに標準で入っている描画用のコンポーネントです。 ですから、WindowsXPで画像ファイルの入っているフォルダを開くとサムネイルが表示されますよね。 あの程度のクオリティでよいのです。 いろいろ考えると、なんだかHintsの設定が反映されていない気がするのです。 (目視で感じているだけので、このへん再検証の必要があるかもしれません) 環境とか関係あるのでしょうか…。 マシン、OS、J2SDK の各種バージョンで検証・調査してみます。 最悪、スケーリングの自前実装も視野に入れつつ、調査してみます。 | ||||
|
投稿日時: 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 のバージョンが違っているのがまずいのかな…。 継続調査します。 | ||||
|
投稿日時: 2005-04-04 09:40
unibon です。こんにちわ。
試してみたのですが、scale が小さすぎる(たとえば0.25位)と Hints が効かないようですが、scale が大きめ(0.5以上)ならば、Hints は目に見えて効くような感じです。おちゃさんの環境で scale を大きめにしても Hints は効かないでしょうか?もし大き目の scale でなら Hints が効くようならば、やっぱりライブラリー(Java2D)の性能(?)なのかもしれません。 | ||||
|
投稿日時: 2005-04-04 17:40
unibonさん、試してくれてありがとございます。
私の環境でも、unibonさんのおっしゃるとおり、scaleが大きめ(0.5以上)だと、非常にきれいな出力が得られています。 目標としているscale = 0.3 ぐらいの出力を得ようとするとHintsが効いていません。 やはりライブラリの仕様なのか…。 J2SDKを入れなおしたり、別のOSで試したり、いろいろな環境で検証してみたのですが、変化はありませんでした。Javaの理念からいえば、ある意味当然なのですが。 今後は「別のライブラリを試してみる or 自分で実装」の方向で検証してみます。 | ||||
|
投稿日時: 2005-04-04 17:50
ふーん、scale = 0.5 ならうまくいくんだ?
scale 0.3 = √0.3 * √0.3 = 0.54 * 0.54 scale = 0.54 で 2回縮小するんじゃだめかね? | ||||
|
投稿日時: 2005-04-04 18:52
もしかして、Graphics#drawImage()に対してはRenderingHintは効かなかったりしませんか?
ラスタ画像の縮小再描画ではなくて、draw(),fill()等を使用したベクトル描画を行えば、 アンチエイリアス等のRenderingHintの効果があったりしません? 昔その辺をいじったとき、私の環境(Win2000+JDK1.3だったかな)では、ベクトル描画命令 ならきれいにアンチエイリアスしてくれていたので… その発想で行くと、Apache-Batikを使用してSVGフォーマットで定義したベクトル画像を 描画、なんてのも良いのかもしれません。 [ メッセージ編集済み 編集者: シュン 編集日時 2005-04-04 18:55 ] |