MacとJavaとアーチェリーと


最近のエントリー


最近のレスポンス
Re: 手作りおせち
これが東京のおせち!、かどうかはわかりま...

Re: 手作りおせち
おおー、うまそう! 地域が違うからか、ウチの実家のものとはだ...

Re: INAXのシャワートイレを買いました
ウンコのライトアップっつうのが正月らしく...
2月 2006
    1  2  3  4 
 5  6  7  8  9  10  11 
 12  13  14  15  16  17  18 
 19  20  21  22  23  24  25 
 26  27  28     
1  |  今日  |  3





はてなブックマーク数

あわせて読みたい


follow yusukey at http://twitter.com



Pebbleの管理画面でサムネイル作成を可能にするため、ちょっと調査してみました。
検証に使ったのは先週携帯で撮った霧のサンフランシスコ。

1600x1200でサイズは380kb。
このサムネイルは iPhoto で作成したもの。

綺麗な縮小画像を作るにはAreaAveragingScaleFilterを使うのがキレイ!って情報がちらほらある。
どうやら内部的にAreaAveragingScaleFilter を使ってくれるっぽい BufferedImage#getScaledInstance() を使って実験。
直接 AreaAveragingScaleFilter を触るよりコード量が少なさそうなので。
(1)コードはこんな感じ

  private static void scaledInstance() throws Exception {
int height = 240;
int width = 320;
FileInputStream fis
= new FileInputStream("./original.jpg");
BufferedImage image = ImageIO.read(fis);
fis.close();
BufferedImage shrinkImage
= new BufferedImage(width, height, image.getType());
shrinkImage.getGraphics()
.drawImage(image.getScaledInstance(width, height
, Image.SCALE_AREA_AVERAGING)
, 0, 0, width, height, null);
ImageIO.write(shrinkImage, "jpg", new File("./2.jpg"));
}

・結果はこんな感じ

まぁそんなシャギーも目立たないし悪くない感じです。
ただやたら時間がかかります。80秒くらい。
パフォーマンスを求めてMovableTypeから移行したのにこれじゃだめですね。

今度はそのままdrawImageする方法。
(2)コードはこんな感じ

private static void graphics2dnohints() throws Exception {
int width = 320;
int height = 240;
FileInputStream fis = new FileInputStream("original.jpg");
BufferedImage image = ImageIO.read(fis);
fis.close();
BufferedImage shrinkImage
= new BufferedImage(width,height, image.getType());
Graphics2D g2d = shrinkImage.createGraphics();
g2d.drawImage(image, 0, 0, width, height, null);
ImageIO.write(shrinkImage, "jpg", new File("graphics2dnohints.jpg"));
}

・結果はこんな感じ

1秒くらいで完了。かなり早いけどあり得ないくらい汚いです。
単に間引いてるだけですね。

じっとAPIを見つめているとGraphics2D#setRenderingHint() ってメソッドが見えてきました。
なんとなくキレイにしてくれそうなオプションを設定して再挑戦。
(3)コードはこんな感じ

private static void graphics2d() throws Exception {
int width = 320;
int height = 240;
FileInputStream fis = new FileInputStream("original.jpg");
BufferedImage image = ImageIO.read(fis);
fis.close();
BufferedImage shrinkImage = new BufferedImage(width,height, image.getType());
Graphics2D g2d = shrinkImage.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_NORMALIZE);
g2d.drawImage(image, 0, 0, width, height, null);
ImageIO.write(shrinkImage, "jpg", new File("graphics2d.jpg"));
}

・結果はこんな感じ

ん、悪くない。むしろ最初の遅いヤツよりキレイなんじゃないの?
しかも早いです。パフォーマンスは体感的にさっきと変わらない感じ。

ではパフォーマンスをざっと検証。
・コードはこんな感じ

public static void main(String[] args) throws Exception {
long before;
double elapsed;
for (int i = 0; i < 10; i++) {
//hotspotをVMに教えてあげる
scaledInstance();
graphics2dnohints();
graphics2d();
}
before = System.currentTimeMillis();
System.out.println("getScaledInstance()");
scaledInstance();
elapsed = (System.currentTimeMillis() - before) / 1000d;
System.out.println(elapsed + " secs");

before = System.currentTimeMillis();
System.out.println("graphics2dnohints()");
graphics2dnohints();
elapsed = (System.currentTimeMillis() - before) / 1000d;
System.out.println(elapsed + " secs");

before = System.currentTimeMillis();
System.out.println("graphics2d()");
graphics2d();
elapsed = (System.currentTimeMillis() - before) / 1000d;
System.out.println(elapsed + " secs");
}

結果はこんな感じ。

getScaledInstance()
72.756 secs
graphics2dnohints()
0.698 secs
graphics2d()
1.463 secs

PhotoShop Elements の結果も加えて並べてみた。

iPhoto:2秒くらい - 38 KB

PhotoShop Elements2.0(jpeg 最高画質):2秒くらい - 56 KB

(1)getScaledInstance(Image.SCALE_AREA_AVERAGING) 72.756 秒 - 11 KB

(2)普通にdrawImage()(レンダリングヒントなし):0.698 秒 - 13 KB

(3)普通にdrawImage()(レンダリングヒント付き):1.463 秒 - 10 KB

さすがにiPhotoとPhoto Shopはほぼ互角に綺麗。iPhotoはなぜか若干暗い。

Javaで処理する場合どれがいいかなー・・って愚問ですね。
レンダリングヒント付きでdrawImageが一番品質対時間比に優れてます。
Javaで作ったサムネイルはどれも細い線の再現性がイマイチで、iPhoto のサムネイルに比べやや眠たい感じだけど十分実用的。
しかし(1)より(3)の方が綺麗に見える。50倍くらい早く出来上がってるんだけど。
(1)は(3)に比べファイルサイズがやや大きいにも関わらずjpeg的なブロックノイズが目立ちます。

タグ :


試合会場はサーカスサーカスホテルからストリップをはさんだちょうど向かい側、リビエラホテルのコンベンションセンター。
エントリーはオンラインで済ませてあるので、受付で名前を言うとルールブックと細かい注意書きのある紙切れを山ほどもらった。
スケジュールにPractice $5 all dayとか書いてあるのでうっすら察していたけれどもやっぱり練習にはお金がかかるらしい。
練習会場の受付でお金を払うと的紙をくれるので、それを空いているマットに貼り付けて練習する仕組み。
17:30くらいだったけど会場はほぼ一杯。
隅の方にようやく空いているマットを見つけ練習開始♪
ほどなく、先ほどのおじさん(Gene Lueck という)がやってきた。
同的で練習しながら色々とコツを教えて貰った。
1. 人のタイミングは気にせず自分のペースでうて
(隣の人がうちおわるのを待ってからセットアップする自分を見て)
日本のインドア大会だと会場の都合から隣の人との距離がメチャメチャ近く、同時にセットアップするのはタブーな場合も。
確かにベガスシュートは大変会場が広いのでそんな心配はないかも。

2. 試合会場には早めについて、上側に的を貼れ
どうやら練習時とおなじく、試合でも自分で的を張るらしい。
で、前半後半でうつ的が上下入れ替わるのだけど、前半上をうって後半下をうつのが楽でしょうと。
なるほどなるほど。


Gene(左)と自分(中)

夕飯もGeneが一緒に食べようということでサーカスサーカスのバッフェへ行った。
メニューは普通だけど一人$10くらい。安い!
Gene の話を聞くと、なんとベガスシュートには初回大会から出場しているとのこと。
アーチェリーは1945年から始めていて、コンパウンドボウは1971年(コンパウンドボウが発明されたか、発売されたあたりらしい)からやっていると!!!
なんか大御所っぽいぞ。有名人なのかなぁ??
シャツに "The 4th Axis" というナゾのロゴがプリントされていたので突っ込んだら、「コレは俺の発明品だ!」ととくとくと説明を受けた。
フィールドで、打ち上げ、打ち下ろし時にバブルがずれて左右に外すのを防ぐためにサイトエクステンションを傾けるための部品らしい。
効果のほどはわからないけど、バブルのないリカーブボウにはとりあえず関係なさそう。

さて、明日は朝7:30から試合だ!!!
早く寝ないと!


さて無事1年ぶりのラスベガスに到着。
空港からはシャトルバスを利用してみた。2人で$10とお手頃。

行き先が試合が開催されるリビエラホテルと、その隣で今回泊まるサーカスサーカスだったので乗客はアーチャーばっか。
カジュアルに話しかけるアメリカ人はどこから来たんだとかどこに泊まるんだとかだれでもかれでもしゃべってる。

われわれに話しかけてきたオッサン(推定63歳)はオレゴン(オーガン、オーガンって聞こえた)から来たらしい。
なんだ君らはベガスシュート初めてか!?とか言って名刺をくれて携帯電話番号を教えてくれた。
なんかわからないことあったらいつでもかけてこい、と。
去年遊びに来たときにサラっと見学したものの、試合に出場となると右も左もわからないのでちょっと不安だったとこ。これは心強い!

さて、チェックインも無難に済ませたので公開練習会場へいきましょか。


ベガスシュート出場のため一路ラスベガスへ。
空港まではいつものBARTで。
もうBARTは慣れてるので何の問題もなく空港へ到着・・・するはずがなんかトラブルが発生したとかで途中で降ろされてしまった。


降りろ、との車内のアナウンスが聞き取れたのは幸いだけども、駅構内のアナウンスはいまいち良く聞こえない。
「空港行きは別のホームに到着しますよ」、とか言ってたらどうしよーとかやや不安になりながら係員に聞いてみたところ
「テクニカルプロブレムが発生したのよ。もうそろそろ別のが来るので、同じホームで待っていればOk。」とのこと。
余裕をもって出発したから良いものの、15〜20分くらい余分に時間かかってしまった。
日本だったら5分も遅れたら結構な異常事態だけど、地元の方々は慣れたもので、とくにザワつくこともなく平気で待ってました。ビバっ 日本!

空港に着いてから飛行機に乗るのは特に問題もなくスムースに。
相変わらずセキュリティチェックは厳しい。


飛行機からのキレイな眺め


TSSより

Perlの世界では馴染み深い(のだと思う)Berkley DBのJava版。
http://dev.sleepycat.com/je-persist-review/

アプリケーション内蔵DBとしては近年は hsqldbが使われることが多いみたいだけど、ハナっからRDBMSとの連携を考えないライトウェイトな製品では有用かな。

タグ :