アプリ版:「スタンプのみでお礼する」機能のリリースについて

下のプログラムのことなのですが、このプログラムをコンパイルし、実行すると動作するのですが画像を他のものに変更して同様に実行すると動作しなくなりました。どうすればいいのでしょうか?教えてくださいお願いします。


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);// 重心の位置の描画
}
}

A 回答 (2件)

画像のフォーマット(色数とか)がちがうとか。

    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
元の画像も変更した画像も同じjpg画像です。
違うとすれば画像自体の大きさ程度なのですが・・・

お礼日時:2010/02/10 00:57

こんにちは、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)

行番号は、違っているので、参考しかなりませんが
    • good
    • 0
この回答へのお礼

回答ありがとうございます

お礼日時:2010/02/10 10:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!