重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。
カラー画像をjavaプログラムで読み込み、グレースケース化して画像を生成したいのですが、最後の画像生成の部分がうまくいきません。具体的には、

Image img_gray = createImage(new MemoryImageSource(w
idth,height,rgb_gray,0,width));

として、img_grayという画像ファイルに変換しようとしています。しかし、コマンドプロンプトでコンパイルしようとすると、

C:\QR>javac Sample.java
Sample.java:78: static でない メソッド createImage(java.awt.image.ImageProducer)
を static コンテキストから参照することはできません。
Image img_gray = createImage(new MemoryImageSource(width,height,
rgb_gray,0,width));

というエラーが出てしまいます。原因が分かりません。どなたか解決策を教えていただける方おられましたらよろしくお願いします。
以下にソースを貼っておきます。


import java.io.*;
import java.lang.*;
import java.awt.*;
import java.awt.Color;
import java.awt.color.ColorSpace;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import javax.media.*;
import javax.media.control.*;
import javax.media.format.*;
import javax.media.util.*;
import java.awt.image.*;
import java.applet.*;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

import java.util.*;
import java.text.*;


public class Sample extends JPanel{
static BufferedImage image;
//static BufferedImage change_image;


public static void main(String[] args) {

//************************************************************************************************
try {
//画像ファイルのデータを読み込む
image = ImageIO.read(new File("C:\\QR\\imagefile\\sa.bmp"));
} catch (Exception e) {
e.printStackTrace();
image = null;
}



// ***********************************************************************************************
//グレースケール
int i,j,r,g,b,d;
Color color;

int width = image.getWidth();
int height = image.getHeight();
int size = width * height;

int[] rgb_src=new int[size];
int[] rgb_gray=new int[size];


PixelGrabber grabber=
new PixelGrabber(image,0,0,width,height,rgb_src,0,width);
try{
grabber.grabPixels(); //画像imageを配列rgb_src[]に読み込む
}catch(InterruptedException e){}


//カラー画像をグレイ化する
for(i=0;i<size;i++){
color=new Color(rgb_src[i]);
r=color.getRed(); //赤の成分を取り出す
g=color.getGreen(); //緑の成分を取り出す
b=color.getBlue(); //青の成分を取り出す
d=(int)(r*0.299+g*0.587+b*0.114); //グレイの成分を作る(NTSC方式準拠)
color=new Color(d,d,d);
rgb_gray[i]=color.getRGB();
}


Image img_gray = createImage(new MemoryImageSource(width,height,rgb_gray,0,width));



}

}

A 回答 (2件)

エラーメッセージの通りだと思いますが・・・。



staticなメソッド"public static void main()"から"createImage()"メソッドを呼ぶ場合には、"createImage()"がstaticで宣言されていないといけませんが、これはjavadocに書いてある通りインスタンス化して使うものです。

以下のようにインスタンスを作成して、インスタンスのメソッドを呼ぶ分には、質問内のエラーは発生しません。

----------------------------------------
JPanel panel = new JPanel();
Image img_gray = panel.createImage(new MemoryImageSource(width,height,rgb_gray,0,width));
----------------------------------------



そもそもJPanelを継承する必要があるのでしょうか?
    • good
    • 0
この回答へのお礼

返事が遅くなってしまい、すみません。
ご回答ありがとうございます。

----------------------------------------
JPanel panel = new JPanel();
Image img_gray = panel.createImage(new MemoryImageSource(width,height,rgb_gray,0,width));
----------------------------------------

提案して下さったように直したところ、無事エラーは消えました。ありがとうございます!


>そもそもJPanelを継承する必要があるのでしょうか?

これについてですが、ネットで調べてみましたが、質問の意味が良く分かりませんでした。すみません。まだJavaについては未熟なもので・・・。

最後に、もう1つ聞いていいでしょうか・・・

変数img_grayを画像ファイル(bitmap等)に変換するにはどのように記述すればいいのでしょうか??これも調べたんですが、うまくいく方法が分かりません。

よろしかったらご回答お願いします。

お礼日時:2008/12/22 11:59

「画像ファイル(bitmap等)に変換する」というのは「ファイル出力する」ということ良いですか?



ImageIOクラスを使えばできると思います。
    • good
    • 0
この回答へのお礼

遅くなってすみません。
ご指摘してもらったように修正したとことろ、無事うまくいきました。
ありがとうございました!

お礼日時:2009/01/09 11:29

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