Java 灰度缓冲区图像的图形/文件输出
我在学校为一个项目做这件事,在这个项目中,更多的功能将在以后添加,但我在完成基本设置时遇到了困难Java 灰度缓冲区图像的图形/文件输出,java,paint,bufferedimage,repaint,grayscale,Java,Paint,Bufferedimage,Repaint,Grayscale,我在学校为一个项目做这件事,在这个项目中,更多的功能将在以后添加,但我在完成基本设置时遇到了困难 我尝试过用C++来做这件事,但是在读了一些关于BuffeReDimaDebug的文档后决定切换到java,但是我遇到了一个带有输出的问题。基本上,这就是我正在设计的程序流程: 1) 提取原始图像(以灰度提供的BMP图像)的灰度值。2) 创建一个currentImage变量以保留原始图像,并对我打算在项目后期执行的图像执行修改。3) 创建一个可重用的输出方法,该方法将获取currentImage Bu
我尝试过用C++来做这件事,但是在读了一些关于BuffeReDimaDebug的文档后决定切换到java,但是我遇到了一个带有输出的问题。基本上,这就是我正在设计的程序流程: 1) 提取原始图像(以灰度提供的BMP图像)的灰度值。2) 创建一个currentImage变量以保留原始图像,并对我打算在项目后期执行的图像执行修改。3) 创建一个可重用的输出方法,该方法将获取currentImage BuffereImage,并将其输出到一个面板(可能还有一个文件)
以下是我目前为止所做的,目前没有任何结果输出到屏幕上,当我尝试执行系统日志时,它没有在我的绘图机制中设置像素值: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);
}
}
}
但是没有用
我这里遗漏了什么?或者是一个完整的重写机制是否正常
感谢您的阅读。我首先想到的是(在您的
paintComponent
方法中)
基本上,你画的是图像本身,你应该做一些像
g.drawImage(image, 0, 0, this);
使用Graphics
context传递给您的是facepalm谢谢!这起作用并将其输出到窗口。StackOverflow允许我在6分钟内标记为已接受。如果您有时间,另一个快速问题是,在我的情况下,paintComponent将执行两次,无论是在程序开始时还是在我调用repaint时(2倍于我的系统。输出)。知道是什么引起的吗?
g = image.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(image, 0, 0, this);