package ProcessImage;import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;public class MyFrame extends JFrame{ JLabel label;
int[] pixArray;
int width;
int height;
public MyFrame(){
init();
}
public static void main(String[] args) {
new MyFrame();
}
public void init(){
JMenuBar bar=new JMenuBar();
JMenu menu1=new JMenu("菜单");
JMenuItem item1=new JMenuItem("打开文件");
menu1.add(item1);
bar.add(menu1);
add(bar,BorderLayout.NORTH);
setSize(200,200);
setLocation(100,100);
setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
item1.addActionListener(new ActionListener(){ @Override
public void actionPerformed(ActionEvent e) {
openFile();
}
});
} public void openFile(){//通过JFileChoose来获取选定的图片 并将其显示在标签上
JFileChooser jc=new JFileChooser();
int returnType=jc.showOpenDialog(null);
if(returnType==JFileChooser.APPROVE_OPTION){
System.out.println("返回类型:"+returnType);
File f=jc.getSelectedFile();
String path=f.getAbsolutePath();
System.out.println(path);
BufferedImage image=null;
try {
image=ImageIO.read(f);
} catch (IOException e) {
e.printStackTrace();
}
width=image.getWidth();
height=image.getHeight();
pixArray=getImagePixArray(image);
label=new JLabel(new ImageIcon(image));
add(label,BorderLayout.CENTER);
validate();
//repaint();
}
}
public int[] getImagePixArray(Image image) {//获取图片像素点 并存在数组里
int[] pixArray=new int[width*height];
PixelGrabber grabber=new PixelGrabber(image,0,0,width,height,pixArray,0,width);
try {
if(!grabber.grabPixels()){
System.out.println("获取图片像素失败");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return pixArray;
}
}
能贴出来你的问题是什么嘛/?JDK早已经支持Raster的方式提取像素了.......
API 文档解释是在存放像素点的数组中 每 获得一行的图片像素点 就在该数组之后 空出指定的长度 然后再存放 图片的下一行像素点
public void openFile(){//通过JFileChoose来获取选定的图片 并将其显示在标签上
JFileChooser jc=new JFileChooser();
int returnType=jc.showOpenDialog(null);
if(returnType==JFileChooser.APPROVE_OPTION){
System.out.println("返回类型:"+returnType);
File f=jc.getSelectedFile();
String path=f.getAbsolutePath();
System.out.println(path);
BufferedImage image=null;
try {
image=ImageIO.read(f);
} catch (IOException e) {
e.printStackTrace();
}
width=image.getWidth();
height=image.getHeight();
pixArray=getImagePixArray(image);//不调用这方法 标签显示图片正常 调用之后 图片显示返现有部分重叠了
label=new JLabel(new ImageIcon(image));
add(label,BorderLayout.CENTER);
validate();
//repaint();
}