0

学校でのプロジェクトでこれを行っていますが、後でより多くの機能が追加されますが、基本的なセットアップを完了するのに問題があります。

最初は 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());

しかし、役に立たない。

ここで何か足りない?それとも仕組みが整っていれば完全書き直しですか?

読んでくれてありがとう。

4

1 に答える 1

1

私に最初に飛び出すのはこれです(あなたのpaintComponent方法で)...

g = image.getGraphics();
g.drawImage(image, 0, 0, null);

基本的に、画像を元の状態に戻します。代わりに、次のようなことを行う必要があります...

g.drawImage(image, 0, 0, this);

Graphics渡されたコンテキストを使用して

于 2013-11-04T04:41:56.093 に答える