![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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);
}
No.2ベストアンサー
- 回答日時:
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];
}
}
これでどうでしょうか?
この回答への補足
ありがとうございます。 説明不足でした。
時間の大半は、下記の部分でかかっております。
なので、ロジック改善による大幅な改善は見込めないと思っております。
PixelGrabber pg_f = new PixelGrabber(oldimg, 0, 0, oldw, oldh, old_pixel, 0, oldw);
try{
pg_f.grabPixels();
} catch (InterruptedException e){
return null;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#のSystem.Windows.Media.Colorに関する質問です。 3 2022/05/18 11:51
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- HTML・CSS ブロックエディターで作りつつ、画像を挿入しつつ、画像にスタイルシートのコードを付ける方法はありますか 1 2022/08/23 18:46
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++からC#のdllを参照する際、...
-
「配列定数は、イニシャライザ...
-
【C#】クラスのメンバ変数のア...
-
C#で「型または名前空間名 'int...
-
再帰・組み合わせ
-
メンバ関数のconst
-
javaのプログラムで、forの文が...
-
javaでべき乗余
-
java spring でエラーが出て困...
-
DataSet(DataTable)の使い方
-
javaについての質問です
-
(Swing)JTextFieldを半角のみ入...
-
intが負の時に投げる例外はあり...
-
アンマネージDLLで、ダイアログ...
-
6桁の数字を重複なしでランダム...
-
classを使って座標軸を求めるコ...
-
javaでcsvファイル読込時の改行...
-
JAVAでCの関数ポインタのような...
-
c# デリゲート関連の命名について
-
式の型は配列型で int に解決済...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
intが負の時に投げる例外はあり...
-
javaでカレンダー作成
-
メインが含まれていません
-
JAVA エラー 式の開始が不正で...
-
Javaで電卓を作りたい
-
javaでcsvファイル読込時の改行...
-
(Swing)JTextFieldを半角のみ入...
-
javaのエラーの意味がわかりま...
-
「WorkImage.getGraphics()」が...
-
初心者ですが、今javaで簡単な...
-
sin曲線とcos曲線を描くプログ...
-
java spring でエラーが出て困...
-
SwingでJtableのヘッダ行が表示...
-
Java 初心者 int型の取り扱い方
-
DataSet(DataTable)の使い方
-
JAVAでCの関数ポインタのような...
-
6桁の数字を重複なしでランダム...
-
JAVA EOFの検出 (条件文で「...
おすすめ情報