日期:2014-05-20 浏览次数:20803 次
package ProImage; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; /* * 1.PixelGrabber :将图片分解成象素存入int[]数组。alpha,green,red ,blue各占8位(bit) * 24-31 位表示 alpha 分量,16-23 位表示红色分量,8-15 位表示绿色分量,0-7 位表示蓝色分量。 00000000(alpha) 00000000(红) 00000000(绿) 00000000(蓝) 0xff=11111111=00000000 00000000 00000000 11111111 2.MemoryImageSource :将int[]数组合成图片.功能和PixelGrabber相反 ImagemodImg = JFrame.createImage( new MemoryImageSource(w,h,colors,0,w)) 3. * */ public class AccordingPixArrayToCreateImage { private int imageWidth; private int imageHeight; private int pixel[]; private int[] blues; private int[] greens; private int[] reds; private Image image; private int index=0; public AccordingPixArrayToCreateImage(){ try { loadImage(); } catch (Exception e) { e.printStackTrace(); } GrabberPixelToArray(); produceImage(blues); } public static void main(String[] args){ new AccordingPixArrayToCreateImage(); } public void loadImage() throws Exception{//载入图片 同时初始化 同时保存图片宽度 高度 image=ImageIO.read(AccordingPixArrayToCreateImage.class.getResource("MM.jpg")); imageWidth=image.getWidth(null); imageHeight=image.getHeight(null); pixel=new int[imageWidth*imageHeight]; blues=new int[imageWidth*imageHeight]; greens=new int[imageWidth*imageHeight]; reds=new int[imageWidth*imageHeight]; System.out.println(imageWidth); System.out.println(imageHeight); System.out.println(imageWidth*imageHeight); } public void GrabberPixelToArray(){//抓取图片的像素点 PixelGrabber grabber=new PixelGrabber(image,0,0,imageWidth,imageHeight,pixel,0,imageWidth); try { grabber.grabPixels();//抓取 System.out.println("-----"+pixel.length); } catch (InterruptedException e) { System.out.println("抓取图片像素出现异常了!!"); e.printStackTrace(); return; } for(int i=0;i<imageHeight;i++){ for(int j=0;j<imageWidth;i++){ initColorArray(pixel[i*imageWidth+j]);//出现数组越界异常!!!!! } } } public void initColorArray(int pixel){ int alpha=pixel>>24;//将像素值右移24位 即将最左边24位移除 该24位为红绿蓝得值 所以最后得到的结果为 00000000 00000000 00000000 11011011(alpha值)alpha值原先在左边 变成最右边 int red=pixel>>16&0xff;//将像素值右移16位即将绿蓝得数值移除 左边补0 在与0xff进行与运算将alpha的值变成全0 int green=pixel>>8&0xff; int blue=pixel&0xff;//蓝色像素位于最低位 所以不用移位 直接将其他位变为0 alpha=alpha<<24;//alpha的值移位后 变成在最低位 所以要还原 左移24位 red=red<<16|alpha;//还原 左移16位 绿蓝的值都变为0 在与alpha值或运算 将alpha值 添加到该值的最高位 所以该颜色 最后保留了alpha值 和红色值 绿蓝都变为0了 green=green<<8|alpha; blue=blue|alpha; reds[index]=red; greens[index]=green; blues[index]=blue; index++; } public void produceImage( int[] pixels){//根据存储像素的数组来初始化图片 JFrame f=new JFrame(); BufferedImage targetImage=(BufferedImage)f.createImage(new MemoryImageSource(imageWidth,imageHeight,pixels,0,imageWidth)); try { ImageIO.write(targetImage, "jpg", new FileOutputStream("c:/red.jpg")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }