Java数字图像处理基础知识 - 必读

转载自:http://blog.csdn.net/jia20003/article/details/7279667

写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的

API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图:

Java数字图像处理基础知识 - 必读

一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等

信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首

先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p

newimageformatIO.jar即可。

Java中如何读写一个图像文件,使用ImageIO对象即可。读图像文件的代码如下:

[java] view plain copy
  1. Filefile=newFile("D:\\test\\blue_flower.jpg");
  2. BufferedImageimage=ImageIO.read(file);

写图像文件的代码如下:

[java] view plain copy
  1. Fileoutputfile=newFile("saved.png");
  2. ImageIO.write(bufferedImage,"png",outputfile);

从BufferedImage对象中读取像素数据的代码如下:

[java] view plain copy
  1. inttype=image.getType();
  2. if(type==BufferedImage.TYPE_INT_ARGB||type==BufferedImage.TYPE_INT_RGB)
  3. return(int[])image.getRaster().getDataElements(x,y,width,height,pixels);
  4. else
  5. returnimage.getRGB(x,y,width,height,pixels,0,width);

首先获取图像类型,如果不是32位的INT型数据,直接读写RGB值即可,否则需要从Raster

对象中读取。

往BufferedImage对象中写入像素数据同样遵守上面的规则。代码如下:

[java] view plain copy
  1. inttype=image.getType();
  2. if(type==BufferedImage.TYPE_INT_ARGB||type==BufferedImage.TYPE_INT_RGB)
  3. image.getRaster().setDataElements(x,y,width,height,pixels);
  4. else
  5. image.setRGB(x,y,width,height,pixels,0,width);


读取图像可能因为图像文件比较大,需要一定时间的等待才可以,Java Advance Image

Processor API提供了MediaTracker对象来跟踪图像的加载,同步其它操作,使用方法如下:

[java] view plain copy
  1. MediaTrackertracker=newMediaTracker(this);//初始化对象
  2. tracker.addImage(image_01,1);//加入要跟踪的BufferedImage对象image_001
  3. tracker.waitForID(1,10000)//等待10秒,让iamge_01图像加载

从一个32位int型数据cARGB中读取图像RGB颜色值的代码如下:

[java] view plain copy
  1. intalpha=(cARGB>>24)&0xff;//透明度通道
  2. intred=(cARGB>>16)&0xff;
  3. intgreen=(cARGB>>8)&0xff;
  4. intblue=cARGB&0xff;

将RGB颜色值写入成一个INT型数据cRGB的代码如下:

[java] view plain copy
  1. cRGB=(alpha<<24)|(red<<16)|(green<<8)|blue;

创建一个BufferedImage对象的代码如下:

[java] view plain copy
  1. BufferedImageimage=newBufferedImage(256,256,BufferedImage.TYPE_INT_ARGB);

一个完整的源代码Demo如下:

[java] view plain copy
  1. packagecom.gloomyfish.swing;
  2. importjava.awt.BorderLayout;
  3. importjava.awt.Dimension;
  4. importjava.awt.Graphics;
  5. importjava.awt.Graphics2D;
  6. importjava.awt.RenderingHints;
  7. importjava.awt.image.BufferedImage;
  8. importjava.io.File;
  9. importjava.io.IOException;
  10. importjavax.imageio.ImageIO;
  11. importjavax.swing.JComponent;
  12. importjavax.swing.JFrame;
  13. publicclassPlasmaDemoextendsJComponent{
  14. /**
  15. *
  16. */
  17. privatestaticfinallongserialVersionUID=-2236160343614397287L;
  18. privateBufferedImageimage=null;
  19. privateintsize=256;
  20. publicPlasmaDemo(){
  21. super();
  22. this.setOpaque(false);
  23. }
  24. protectedvoidpaintComponent(Graphicsg){
  25. Graphics2Dg2=(Graphics2D)g;
  26. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  27. g2.drawImage(getImage(),5,5,image.getWidth(),image.getHeight(),null);
  28. }
  29. privateBufferedImagegetImage(){
  30. if(image==null){
  31. image=newBufferedImage(size,size,BufferedImage.TYPE_INT_ARGB);
  32. int[]rgbData=newint[size*size];
  33. generateNoiseImage(rgbData);
  34. setRGB(image,0,0,size,size,rgbData);
  35. FileoutFile=newFile("plasma.jpg");
  36. try{
  37. ImageIO.write(image,"jpg",outFile);
  38. }catch(IOExceptione){
  39. e.printStackTrace();
  40. }
  41. }
  42. returnimage;
  43. }
  44. publicvoidgenerateNoiseImage(int[]rgbData){
  45. intindex=0;
  46. inta=255;
  47. intr=0;
  48. intg=0;
  49. intb=0;
  50. for(introw=0;row<size;row++){
  51. for(intcol=0;col<size;col++){
  52. //setrandomcolorvalueforeachpixel
  53. r=(int)(128.0+(128.0*Math.sin((row+col)/8.0)));
  54. g=(int)(128.0+(128.0*Math.sin((row+col)/8.0)));
  55. b=(int)(128.0+(128.0*Math.sin((row+col)/8.0)));
  56. rgbData[index]=((clamp(a)&0xff)<<24)|
  57. ((clamp(r)&0xff)<<16)|
  58. ((clamp(g)&0xff)<<8)|
  59. ((clamp(b)&0xff));
  60. index++;
  61. }
  62. }
  63. }
  64. privateintclamp(intrgb){
  65. if(rgb>255)
  66. return255;
  67. if(rgb<0)
  68. return0;
  69. returnrgb;
  70. }
  71. publicvoidsetRGB(BufferedImageimage,intx,inty,intwidth,intheight,int[]pixels){
  72. inttype=image.getType();
  73. if(type==BufferedImage.TYPE_INT_ARGB||type==BufferedImage.TYPE_INT_RGB)
  74. image.getRaster().setDataElements(x,y,width,height,pixels);
  75. else
  76. image.setRGB(x,y,width,height,pixels,0,width);
  77. }
  78. publicstaticvoidmain(String[]args){
  79. JFrameframe=newJFrame("NoiseArtPanel");
  80. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  81. frame.getContentPane().setLayout(newBorderLayout());
  82. //Displaythewindow.
  83. frame.getContentPane().add(newPlasmaDemo(),BorderLayout.CENTER);
  84. frame.setPreferredSize(newDimension(400+25,450));
  85. frame.pack();
  86. frame.setVisible(true);
  87. }
  88. }


你可能感兴趣的:(java)