【问题标题】:Graphical/File output for Grayscale BufferedImage灰度 BufferedImage 的图形/文件输出
【发布时间】:2013-11-04 12:41:56
【问题描述】:

我正在为学校的一个项目执行此操作,稍后将添加更多功能,但我无法完成基本设置。

我最初尝试在 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 中声明 image 是一个空图像,而 setImage 是分配时未正确复制其所有内容。我试着摆弄使用这个:

this.image.setData(image.getData());

但无济于事。

我在这里遗漏了什么?或者如果机制按顺序完全重写?

感谢您的阅读。

【问题讨论】:

    标签: java paint bufferedimage repaint grayscale


    【解决方案1】:

    我首先想到的是这个(在你的paintComponent 方法中)......

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

    基本上,您将图像重新绘制回自身,而不是您应该执行类似...

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

    使用传递给您的 Graphics 上下文

    【讨论】:

    • facepalm 谢谢!这有效并将其输出到窗口。当 StackOverflow 允许我在 6 分钟内标记为已接受。如果您有时间,还有一个快速的问题,在我的例子中,paintComponent 被执行了两次,无论是在程序开始时还是在我调用 repaint 时(我的 System.out 的 2 倍)。知道是什么原因造成的吗?
    猜你喜欢
    • 2011-11-16
    • 2011-12-19
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多