- 締切済み
Image を90度回転して、新しいImageを作成するには?
Image データがあったとして、それを90度回転させた別のImageを作成したいのですが、すごく時間がかかります。 もっといいやり方があると思うのですが、ネットで調べても方法が見つかりませんでした。 今採用しているのは下記のようなやり方です。 もっと短時間でImage作成できる、良い方法をご教授頂けないでしょうか? PixelGrabber pg_f = new PixelGrabber(oldimg, 0, 0, oldw, oldh, old_pixel, 0, oldw); try{ pg_f.grabPixels(); } catch (InterruptedException e){ return null; } int trans = ~0x00000000; for (int x = 0; x < oldw; x++) { for (int y = 0; y < oldh; y++) { new_pixel[y + (newh - x - 1) * neww] = old_pixel[x + oldw * y] & trans; } } Image new_img = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(neww, newh, new_pixel, 0, neww)); MediaTracker mediaTracker = new MediaTracker(frame); mediaTracker.addImage(new_img, 0); try { mediaTracker.waitForID(0); } catch (InterruptedException ie) { System.err.println(ie); System.exit(1); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Bonjin
- ベストアンサー率43% (418/971)
Javaではイメージ加工(移動、回転、伸縮)を行うためにAffineTransformというクラスが用意されています。
- noocyte
- ベストアンサー率58% (171/291)
Java には詳しくないので,PixelGrabber や MediaTracker が何で, 何をしているのかよく知りませんが,時間がかかっているのは 画像の回転を行っている2重ループの部分だと思います. (そのことは確認しましたか? その部分と,それ以外の部分の実行時間は計ってみましたか?) 以下,その前提でとりあえずすぐ思いつく改良案を書きます. (1) まず,最初に思いつくのは,trans=~0 で & を取っているのが無駄. trans に別の値を入れる予定がなければ削除. (2) 次に思いつくのは,配列の添字の1次式を毎回計算しているのが効率悪い. 乗算を使わず加算だけで行えるように添字の計算方法を変更した方がよい. (3) 読み出し側の old_pixel[] の要素のアクセス順序がとびとびなので, キャッシュの効きが悪い.要素が順番にアクセスされるよう, xとyのループを入れ替えてみては? (書き込み側の new_pixel[] のアクセス順序はどうなんだといわれると, 確かにそれも考慮する必要はあるが,それをやろうとするとかなり面倒に なりそうなので,とりあえず考慮しないことにする.) int i = 0; int j = neww * newh; for(int y = 0; y < oldh; y++, j++) { int k = j; for(int x = 0; x < oldw; x++, i++) { k -= neww; new_pixel[k] = old_pixel[i]; } } これでどうでしょうか?
- cdsdasds
- ベストアンサー率52% (114/217)
一般に図形操作は細かいノウハウが実行時間に影響しますから、この際フリーのユーティリティをシステムコールして使うとかではだめなのでしょうか。
補足
フリーのユーティリティで、Javaから使えるようなもの等紹介頂けないでしょうか?
補足
ありがとうございます。 説明不足でした。 時間の大半は、下記の部分でかかっております。 なので、ロジック改善による大幅な改善は見込めないと思っております。 PixelGrabber pg_f = new PixelGrabber(oldimg, 0, 0, oldw, oldh, old_pixel, 0, oldw); try{ pg_f.grabPixels(); } catch (InterruptedException e){ return null; }