下のプログラムのことなのですが、このプログラムをコンパイルし、実行すると動作するのですが画像を他のものに変更して同様に実行すると動作しなくなりました。どうすればいいのでしょうか?教えてくださいお願いします。
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
public class moji extends Applet
{
Image img;// 元のイメージ
int img_width = 0;// 元のイメージの幅
int img_height = 0;// 元のイメージの高さ
int pix[];// 元のイメージを格納する配列
int wcnt_pix[];// 行ごとの黒画素数を格納する配列
int hcnt_pix[];// 列ごとの黒画素数を格納する配列
int cnt = 0;// 黒画素のカウント用
int cnt_sum = 0;// 黒画素のカウント総数
int chu = 0;// 中心値
int sum1 = 0;
int sum2 = 0;
int x = 0;
int y = 0;
int xmax = 0;// 黒画素の右端
int xmin = 0;// 黒画素の左端
int ymax = 0;// 黒画素の上端
int ymin = 0;// 黒画素の下端
public void init(){
img = getImage(getDocumentBase(), "test.jpg");// イメージのロード
MediaTracker mt = new MediaTracker(this);
mt.addImage(img, 0);
try{
mt.waitForID(0);
}catch(InterruptedException e){}// イメージのロード完了まで待機
img_width = img.getWidth(this);// 元のイメージの幅を取得
img_height = img.getHeight(this);// 元のイメージの高さを取得
cntpix();
box_top();
box_bot();
box_rig();
box_lef();
}
// 黒画素数のカウント
public void cntpix(){
pix = new int[img_width * img_height];
wcnt_pix = new int[img_width];
hcnt_pix = new int[img_height];
try{
PixelGrabber pg = new PixelGrabber(img, 0, 0, img_width, img_height, pix, 0, img_width);
pg.grabPixels();
}catch(InterruptedException e){}
// 行ごとのカウント
for(int wj = 0; wj < img_height; wj++){
cnt = 0;
for(int wi = 0; wi < img_width; wi++){
if((pix[wj * img_width + wi] & 255) < 128){
cnt++;
}
}
wcnt_pix[wj] = cnt;
cnt_sum = cnt_sum + cnt;
}
// 列ごとのカウント
for(int hi = 0; hi < img_width; hi++){
cnt = 0;
for(int hj = 0; hj < img_height; hj++){
if((pix[hj * img_width + hi] & 255) < 128){
cnt++;
}
}
hcnt_pix[hi] = cnt;
}
chu = cnt_sum / 2;// 中心値
// 中心値より重心が何行目かを求める
int i = 0;
while(sum1 < chu){
sum1 = sum1 + wcnt_pix[i];
i++;
}
x = i - 1;
// 中心値より重心が何列目かを求める
int j = 0;
while(sum2 < chu){
sum2 = sum2 + hcnt_pix[j];
j++;
}
y = j - 1;
}
// 黒画素の上端を求める
public void box_top(){
int ti = 0;
while(wcnt_pix[ti] == 0){
ymax = ti;
ti++;
}
}
// 黒画素の下端を求める
public void box_bot(){
int bi = img_height - 1;
while(wcnt_pix[bi] == 0){
ymin = bi;
bi--;
}
}
// 黒画素の右端を求める
public void box_rig(){
int ri = 0;
while(hcnt_pix[ri] == 0){
xmin = ri;
ri++;
}
}
// 黒画素の左端を求める
public void box_lef(){
int li = img_width - 1;
while(hcnt_pix[li] == 0){
xmax = li;
li--;
}
}
// 画像等の描画
public void paint(Graphics g){
int box_w = xmax - xmin;
int box_h = ymin - ymax;
int dx = x - xmin;// 重心のX座標
int saku = dx / 20 * 3;// 錯視による誤差
int dy = ymin - y + saku;// 重心のY座標
g.drawImage(img, 0, 0, this);
g.drawString("このイメージの幅は"+img_width+"で高さは"+img_height+"です。", 0, 20);// 画像の描画
g.drawRect(xmin, ymax, box_w, box_h);// バウンディングボックスの描画
g.setColor(Color.red);
g.fillOval(xmin-3, ymin-3, 6, 6);
g.drawString("原点( 0, 0 )", xmin-20, ymin+20);// 原点の描画
g.drawString("文字の重心は、( "+dx+", "+dy+" )です。", 0, 40);// 重心の描画
g.drawLine(x-10, y-saku, x+10, y-saku);// 重心の位置の描画
g.drawLine(x, y-saku+10, x, y-saku-10);// 重心の位置の描画
}
}
No.1ベストアンサー
- 回答日時:
画像のフォーマット(色数とか)がちがうとか。
。早速の回答ありがとうございます。
元の画像も変更した画像も同じjpg画像です。
違うとすれば画像自体の大きさ程度なのですが・・・
No.2
- 回答日時:
こんにちは、IDE使ってますよね。
エラーメッセージが出るので、自分で、ある程度
解決しますよ。
私のIDEで、エラー探すと
>img_width = img.getWidth(this); // 元のイメージの幅を取得
>img_height = img.getHeight(this); // 元のイメージの高さを取得
System.out.println(img_width + " "+ img_height);
>cntpix();
img_widthとimg_heightが、-1を返しています。
その結果
>wcnt_pix = new int[img_width];
の配列が、wcnt_pix = new int[-1];
になっています。
これで、私の環境では、エラーが出ています。
画像サイズが、質問者とは、違うので、同様な、
エラーが出るかわかりませんが、
とりあえず、この辺を確認した後
IDEのエラーメッセージに基づいて、
エラーを探せば、動くようになるかと思います。
もし、それでも、解らないらなら、
エラーメッセージを、表示してください。
そうすると、何処で、エラーしているか
レスがつくかもしれません。
因みに、私の環境で、出ている、エラーメッセージは
以下のようになっています。
java.lang.NegativeArraySizeException
at applet.applet.cntpix(applet.java:61)
at applet.applet.init(applet.java:49)
at sun.applet.AppletPanel.run(AppletPanel.java:424)
at java.lang.Thread.run(Thread.java:619)
行番号は、違っているので、参考しかなりませんが
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
Javaのファイル名チェックについて
-
Javaで電卓を作りたい
-
式の型は配列型で int に解決済...
-
javaの課題・・
-
SwingでJtableのヘッダ行が表示...
-
Stringの文字列をString[]配列...
-
複数のボタンを配置し、それぞ...
-
JAVAでCの関数ポインタのような...
-
デスクトップのアイコンの位置...
-
リサージュ図形
-
JTableのセルの背景色について
-
各店舗全て、リンゴは1個150円...
-
(Swing)JTextFieldを半角のみ入...
-
C#で、デリゲートからその関数...
-
BufferedImageをbyte[]に変換っ...
-
javaでカレンダー作成
-
JAVA エラー 式の開始が不正で...
-
西暦 -> 年号、年号 -> 西暦の...
-
消費税を計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
DataSet(DataTable)の使い方
-
「配列定数は、イニシャライザ...
-
JUnit4のアノテーションについて
-
C#で実行時にメソッドの返り値...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
c# デリゲート関連の命名について
-
java streamでenum配列への変換
-
intが負の時に投げる例外はあり...
-
Java 初心者 int型の取り扱い方
-
C++からC#のdllを参照する際、...
-
アンマネージDLLで、ダイアログ...
-
【C#】フォームをなめらかに移動
-
(Swing)JTextFieldを半角のみ入...
-
Javaで簡単なアニメーションを...
-
javaのエラーの意味がわかりま...
-
C#で判断文(三択)の省略形は...
-
共有メモリについて
おすすめ情報