- PR -

forループ

投稿者投稿内容
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-04 11:19
処理を付け足していたのを忘れてました。
色はきちんと表示されました。すみません。

引用:

NaNさんの書き込み (2005-04-03 21:36) より:
ところで、どうやってデバックしています?
最近の定番は eclipse ですが、使っています?


はずかしながらデバッグにeclipseは使っていません。
System.outで表示させるぐらいしかしていません。
eclipseお薦めですか?
NaN
会議室デビュー日: 2005/04/03
投稿数: 10
投稿日時: 2005-04-04 13:04
引用:

eclipseお薦めですか?



System.out.println によるデバックは基本で、ある意味十分でもあるんですが、
止めたり動かしたり、変数を見たり変えたり、はデバックにとても有益です。
デバッカなら何でもいいんですが、今なら eclipse でしょう。
会社や客先の方針があってそれに制約されるならしょうがないですが。
eclipse の登場と普及は java10年の歴史のなかの最大の事件と思います。
ぜひ。

ところで fill の性能はどんな感じ?
C と比べてどうでした?


kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-05 02:45
実行速度は前(下記のソースでのコメントアウト部)にくらべて数倍も早くなりました。
しかし、下記のソースコードでは画面の再描画がされずにフリーズしたようになってしまいます。

Color pixel = new Color(image.getRGB(loop1,loop2));
でピクセル値を取得して
temp.setRGB(loop1,loop2,blue.getRGB());
でピクセル値を変更するときちんと再描画されるのですが...

どこか間違っているでしょうか?

private BufferedImage image;
image=proces(image);
 ・
 ・
 ・
 ・
private BufferedImage proces(BufferedImage image) {
BufferedImage temp = new BufferedImage(image.getWidth(this),
image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = image.getRaster();
int colorData[] = new int [4];
int PixelColor[] = new int [4];
PixelColor[0] = 0; PixelColor[1] = 0; PixelColor[2] = 255;
int PixelColor1[] = new int [4];
PixelColor1[0] = 255; PixelColor1[1] = 0; PixelColor1[2] = 0;
//2値変換
for(int loop1 = 0; loop1 < image.getWidth(this); loop1++) {
for(int loop2 = 0; loop2 < image.getHeight(this); loop2++) {
//Color pixel = new Color(image.getRGB(loop1,loop2));
raster.getPixel(loop1,loop2,colorData);
if(colorData[0] > threshold ||
colorData[1] > threshold ||
colorData[2] > threshold) {
raster.setPixel(loop1,loop2,PixelColor1);
//temp.setRGB(loop1,loop2,blue.getRGB());
}
else{
raster.setPixel(loop1,loop2,PixelColor);
//temp.setRGB(loop1,loop2,red.getRGB());
}
}
}
return temp;
}
NaN
会議室デビュー日: 2005/04/03
投稿数: 10
投稿日時: 2005-04-05 09:55
引用:

実行速度は前(下記のソースでのコメントアウト部)にくらべて数倍も早くなりました。
しかし、下記のソースコードでは画面の再描画がされずにフリーズしたようになってしまいます。



「数倍も早く」と「フリーズしたように」は矛盾するように思えますが...
そういうときは for に System.out.println でも入れてみましょう。
どうなりますか?
「数倍も早く」は何に比べて数倍ですか?

うまくいくソースうまくいかないソースを並べて提示していただけると
評価しやすいです。
//Color pixel = new Color(image.getRGB(loop1,loop2));
この pixel をどういう風にしたらうまくいきましたか?

>raster.setPixel(loop1,loop2,PixelColor);
temp に setPixel するなら
WritableRaster は temp.getRaster();
で取得する必要がありますよ。
提示ソースでは temp には書かれていません。
もとの image と同じ画像です。

「フリーズしたように」は別の原因でしょうね。


[ メッセージ編集済み 編集者: NaN 編集日時 2005-04-05 10:09 ]

[ メッセージ編集済み 編集者: NaN 編集日時 2005-04-05 11:00 ]
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-07 15:31
すみません、返信遅れました。
ソース1がうまくいく、ソース2がうまくいかないプログラムです。
それぞれに時間を取得する関数をはさんで実行させました。
その結果、ソース1よりもソース2の方が数倍早かったです。
しかしソース2では画面がフリーズしたようになってしまいます。


ソース1:
private BufferedImage proces(BufferedImage image) {
BufferedImage temp = new BufferedImage(image.getWidth(this),
                   image.getHeight(this),
                   BufferedImage.TYPE_INT_ARGB);

//2値変換
for(int loop1 = 0; loop1 < image.getWidth(this); loop1++) {
 for(int loop2 = 0; loop2 < image.getHeight(this); loop2++) {
  Color pixel = new Color(image.getRGB(loop1,loop2));
  if(pixel.getRed() > threshold ||
    pixel.getGreen() > threshold ||
    pixel.getBlue() > threshold) {
temp.setRGB(loop1,loop2,blue.getRGB());
}
else{
temp.setRGB(loop1,loop2,red.getRGB());
}
}
}
return temp;
}

ソース2:
private BufferedImage proces(BufferedImage image) {
BufferedImage temp = new BufferedImage(image.getWidth(this),
image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = image.getRaster();
int colorData[] = new int [4];
int PixelColor[] = new int [4];
PixelColor[0] = 0; PixelColor[1] = 0; PixelColor[2] = 255;
int PixelColor1[] = new int [4];
PixelColor1[0] = 255; PixelColor1[1] = 0; PixelColor1[2] = 0;

//2値変換
for(int loop1 = 0; loop1 < image.getWidth(this); loop1++) {
for(int loop2 = 0; loop2 < image.getHeight(this); loop2++) {
raster.getPixel(loop1,loop2,colorData);
if(colorData[0] > threshold ||
colorData[1] > threshold ||
colorData[2] > threshold) {
raster.setPixel(loop1,loop2,PixelColor1);
}
else{
raster.setPixel(loop1,loop2,PixelColor);
}
}
}
return temp;
}
NaN
会議室デビュー日: 2005/04/03
投稿数: 10
投稿日時: 2005-04-07 15:49
引用:

その結果、ソース1よりもソース2の方が数倍早かったです。
しかしソース2では画面がフリーズしたようになってしまいます。



これが良く理解できません。
「数倍も早く」と「フリーズしたように」は矛盾していませんか?

ソース1は getRGB - setRGB、
ソース2は getPixel - setPixel で一見対照的に見えますが、
両ソース、まったく違ったことをしています。

ソース1は image を元に生成した temp に setRGB していますが、
ソース2は image を元に生成した temp に で は な く image に setPixel してます。
結局ソース2の proces の return する temp は image と同一の画像内容です。
そういうことを意図しているのですか?
kosuke
常連さん
会議室デビュー日: 2005/03/24
投稿数: 48
投稿日時: 2005-04-07 16:06
引用:

NaNさんの書き込み (2005-04-07 15:49) より:

ソース1は getRGB - setRGB、
ソース2は getPixel - setPixel で一見対照的に見えますが、
両ソース、まったく違ったことをしています。

ソース1は image を元に生成した temp に setRGB していますが、
ソース2は image を元に生成した temp に で は な く image に setPixel してます。
結局ソース2の proces の return する temp は image と同一の画像内容です。
そういうことを意図しているのですか?




すみません、勘違いしていました。
ソース1とソース2で同様のことをしたかったのですが...
ソース2でtempにsetPixelするようにしてやってみます。

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