アプレットは初期化されていません
いつもお世話になっています。
早速ですが、appletviewerで見たときにタイトルのように「アプレットは初期化されていません」と出てきます。これを解決するにはどうすればいいのでしょうか?
ちなみに私が作っているのは白黒のみの画像をロードして、黒い部分を四角で覆い重心を求めるというものです。ソースを載せておきます。
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
public class test 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;
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;
while(hcnt_pix[li] == 0){
xmax = li;
li--;
}
}
// 画像等の描画
public void paint(Graphics g){
int dx = x - xmin; // 重心のX座標
int dy = y - ymax; // 重心のY座標
g.drawImage(img, 0, 0, this);
g.drawString("このイメージの幅は"+img_width+"で高さは"+img_height+"です。", 0, 20); // 画像の描画
g.drawLine(xmin, ymax, ymax, ymax);
g.drawLine(xmin, ymax, xmin, ymin);
g.drawLine(xmin, ymin, xmax, ymin);
g.drawLine(xmax, ymax, xmax, ymax); // バウンディングボックスの描画
g.setColor(Color.red);
g.drawString("重心は、( "+dx+", "+dy+" )です。", 0, 60); // 重心の描画
g.drawLine(x-10, y, x+10, y); // 重心の位置の描画
g.drawLine(x, y+10, x, y-10); // 重心の位置の描画
}
}
補足
見ていただいてありがとうございます! 最初に以下のソースファイルとヘッダファイル1つとwriteBmp.cというファイルが渡されたのでBMPファイルが出力できるのだと思います。 課題はこのソースファイルに付け足すというものです! スキャンラインY=yが何を意味するのか分からないし、線形補間が何かを調べたんですが理解ができなくて困っています>< /* 24ビットBMPファイルの書き込み */ #include "cg.h" #include "writeBmp.c" /* ビットマップデータの生成 */ void mbitmap(int width, int height) { int i, j; for (i=0; i<height; i++) for (j=0; j<width; j++) { Pixel[i][j][0] = (unsigned char)255; Pixel[i][j][1] = (unsigned char)255; Pixel[i][j][2] = (unsigned char)0; } } void main(void) { int width = 640, height = 480; /* ビットマップデータの生成 */ mbitmap(width, height); /* 24ビット-ビットマップファイルへの書き込み */ bmpout("sample.bmp", width, height); }