一次元配列から画像を生成するとき。。。
お世話になります。
カラー画像を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));
}
}
お礼
回答有難うございます。 下のように書き換えてやりましたが、 //Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException //at BufferedImage1.paint(BufferedImage1.java:47) のようなエラーコメントが出て、 「newimg = change( bi , new BufferedImage( 100 ,100 ,BufferedImage.TYPE_4BYTE_ABGR_PRE ) ) ;」 の箇所で newimg がNULL値をとっています。 どこが悪いのでしょうか、宜しくお願いします。 ====================================================================== public class BufferedImage1 extends Applet { static BufferedImage srcimage1 , newimg ; static Image srcimage0 ; static BufferedImage source ; static BufferedImage target ; static Graphics g ; static Graphics2D g2 ; static Image img ; public void init() { this.setLocation( 0 , 0 ) ; setBackground( Color.red ) ; g2 = (Graphics2D)g ; // srcimage0 = Toolkit.getDefaultToolkit().getImage("a.gif"); // srcimage1 = ( BufferedImage )srcimage0 ; // newimg = change(srcimage1 , new BufferedImage(100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE)) ; try { BufferedImage bi = ImageIO.read( new File(getCodeBase() + "a.gif" ) ) ; newimg = change( bi , new BufferedImage( 100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE ) ) ; } catch(Exception e){} } public void paint(Graphics g) { g2.drawImage(newimg , 0 , 0 , null ) ; } public BufferedImage change( BufferedImage source , BufferedImage target) { this.source = source ; this.target = target ; Graphics2D g2 = target.createGraphics() ; g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION , RenderingHints.VALUE_INTERPOLATION_BICUBIC) ; double scalex = (double) target.getWidth() / source.getWidth() ; double scaley = (double) target.getHeight() / source.getHeight() ; AffineTransform xform = AffineTransform.getScaleInstance(scalex , scaley) ; g2.drawRenderedImage(source , xform) ; g2.dispose() ; return target ; } }