こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

表示されない

 いつもお世話になっています。早速ですが質問させていただきます。
 下記のようなプログラムを作成したのですが、コンパイルは出来てもアプレットビューワーを使って実行したのですが表示されません。
教えてくださいお願いします。

import java.applet.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(), "kome.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, ymin+40);// 画像の描画
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, ymin+60);// 重心の描画
g.drawLine(x-10, y-saku, x+10, y-saku);// 重心の位置の描画
g.drawLine(x, y-saku+10, x, y-saku-10);// 重心の位置の描画
}
}

投稿日時 - 2010-02-10 20:57:14

QNo.5665717

すぐに回答ほしいです

質問者が選んだベストアンサー

何が「表示されません」という話なのでしょうか。
アプレット起動用のHTMLファイルとkome.jpgファイルを適切な場所に配置してappletviewerを実行すれば、その画像と「このイメージの幅は~」などの文字がアプレットのウィンドウ内に表示されるみたいですけど。
「文字の重心」の計算が妥当かどうかは見ていません。

投稿日時 - 2010-02-10 23:29:45

補足

 回答ありがとうございます。少し補足させていただきますね。
 表示されないとは、アップレット自体が表示されないんです。実はこのプロラムを作成するときは別の画像(同じjpg画像)を使ってやっていたのですが、その画像ではちゃんとアプレットが表示されたんです。
 しかし、今回のように画像を変えただけなのにアプレットが表示されなかったのです。ちなみに画像はすべて同じフォルダ内にあります。
 何が原因だったのでしょうか?

投稿日時 - 2010-02-11 08:56:42

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ああ、私のところで問題なく実行できた理由が分かりました。使用する.jpgファイルの縦・横のドット数が同じだと問題が発生しません。

配列wcnt_pixは、cntpix()の始めのほうでnewしているとおり要素数がimg_widthです。そして「//行ごとのカウント」というループで、変数wjが変化する範囲は0~(img_height-1)となっています。しかし、そのループの中でwcnt_pix[wj]というアクセスがあるので、wj≧img_widthとなったところでArrayIndexOutOfBoundsExceptionが発生します。
この例外が発生するのは配列の要素数または添字の値を間違えている場合ですから、その辺りを確認してください。

なお、「//列ごとのカウント」のループにも同様の問題があります。

投稿日時 - 2010-02-11 18:27:30

ANo.2

「何が原因だったのでしょうか?」と聞かれても、あまりにも情報が不足していて答えようがありません。
たとえば、
・アプレットが表示されないというのは、appletviewerのウィンドウも表示されないのか、ウィンドウは出るがその中身が描画されないのか
・何らかのエラーメッセージや例外が出ているのか
・そもそも、どうやって起動しているのか(moji.classとHTMLファイルとkome.jpgがどこに置かれていて、どのようなコマンドを実行しているのか、その他)
・元の画像に戻せば正しく表示されるのか
など。

私の手元ではアプレットのウィンドウ内にkome.jpgの画像が表示されるので、プログラム自体が根本的に間違っているわけではなさそうです。kome.jpgの配置かファイル名を間違っているというのが一番ありそうな気がします。他の可能性としては、お使いのkome.jpgが正しいjpgファイルでないとか。

デバッガを使うなどして、どのメソッドのどこまで実行されているのか追いかけてみましたか?

投稿日時 - 2010-02-11 12:05:42

補足

説明不足ですみません。
クラスファイル、HTMLファイル、jpg画像など関係あるファイルはすべて同じフォルダ内にあります。
appletviewerで起動しました。ウィンドウは出るのですがその中身が描画されません。appletviewerを閉じると下のようなエラー?のようなものが出ました。

java.lang.ArrayIndexOutOfBoundsException: 108
at moji.cntpix(moji.java:80)
at moji.init(moji.java:41)
at sun.applet.AppletPanel.run(AppletPanel:424)
at java.lang.Thread.run(Thread.java:619)

ちなみにプログラムはそのままで元の画像に戻すとちゃんと描画されます。

投稿日時 - 2010-02-11 14:00:54

あなたにオススメの質問