学校でのプロジェクトでこれを行っていますが、後でより多くの機能が追加されますが、基本的なセットアップを完了するのに問題があります。
最初は C++ でこれを実行しようとしましたが、BufferedImage に関するドキュメントを読んだ後に Java に切り替えることにしましたが、出力で問題が発生しています。基本的に、これは私がプログラムの流れを次のように設計しているものです。1) 元の画像 (グレースケールで提供される BMP 画像) のグレースケール値を抽出します。2) currentImage 変数を作成して元の画像を保存し、プロジェクトの後の段階で実行する予定の画像に変更を加えます。3) currentImage BufferedImage を受け取る再利用可能な出力メソッドを作成し、それをパネル (および場合によってはファイル) に出力します。
これは私がこれまでに持っていたもので、現在は画面に何も出力されていません。システムログを実行しようとすると、描画メカニズムでピクセル値が設定されていません:
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
@SuppressWarnings("serial")
public class ImageDriver extends JFrame {
DrawPanel paintPanel;
static int width = 1024, height = 768;
BufferedImage originalImage, currentImage;
File theImageFile;
int[][] imageData;
public ImageDriver() {
super("Image Processing");
setSize(width, height);
setDefaultCloseOperation(EXIT_ON_CLOSE);
paintPanel = new DrawPanel(width, height);
add(paintPanel);
}
public void updateImageDisplay() {
System.out.println("In updateImageDisplay!");
paintPanel.setImage(currentImage);
}
public void readImage() {
try {
theImageFile = new File("images/img1.bmp");
originalImage = ImageIO.read(theImageFile);
currentImage = originalImage;
}
catch (IOException e) {
e.printStackTrace();
}
//get a raster to extract grayscale values
Raster image_raster = currentImage.getData();
//get pixel by pixel
int[] pixel = new int[1];
int[] buffer = new int[1];
imageData = new int[image_raster.getWidth()][image_raster.getHeight()];
for(int i = 0 ; i < image_raster.getWidth() ; i++)
for(int j = 0 ; j < image_raster.getHeight() ; j++) {
pixel = image_raster.getPixel(i, j, buffer);
imageData[i][j] = pixel[0];
//System.out.println("Pixel at: " + i + " x " + j + ": " + imageData[i][j]);
}
}
public void increaseContrast() {
}
public static void main(String[] args) {
ImageDriver driver = new ImageDriver();
driver.setVisible(true);
driver.readImage();
driver.updateImageDisplay();
driver.increaseContrast();
driver.updateImageDisplay();
}
class DrawPanel extends JPanel {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
public DrawPanel(int width, int height) {
setPreferredSize(new Dimension(width, height));
}
public void setImage(BufferedImage image) {
System.out.println("In setImage!");
this.image = image;
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("in paintPanel component!");
g = image.getGraphics();
g.drawImage(image, 0, 0, null);
}
}
}
最初はDrawPanelで画像を空の画像であると宣言しており、割り当て時にsetImageがすべてのコンテンツを適切にコピーしていないためだと思います。私はこれを使っていじってみました:
this.image.setData(image.getData());
しかし、役に立たない。
ここで何か足りない?それとも仕組みが整っていれば完全書き直しですか?
読んでくれてありがとう。