生活随笔
收集整理的這篇文章主要介紹了
Java数字图像处理基础知识 - 必读
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)載自:http://blog.csdn.net/jia20003/article/details/7279667
寫了很多篇關(guān)于圖像處理的文章,沒有一篇介紹Java 2D的圖像處理API,文章討論和提及的
API都是基于JDK6的,首先來看Java中如何組織一個圖像對象BufferedImage的,如圖:
一個BufferedImage的像素數(shù)據(jù)儲存在Raster中,ColorModel里面儲存顏色空間,類型等
信息,當(dāng)前Java只支持一下三種圖像格式- JPG,PNG,GIF,如何向讓Java支持其它格式,首
先要 完成Java中的圖像讀寫接口,然后打成jar,加上啟動參數(shù)- Xbootclasspath/p
newimageformatIO.jar即可。
?
Java中如何讀寫一個圖像文件,使用ImageIO對象即可。讀圖像文件的代碼如下:
[java]?view plaincopy
File?file?=?new?File("D:\\test\\blue_flower.jpg");?? BufferedImage?image?=?ImageIO.read(file);?? 寫圖像文件的代碼如下:
[java]?view plaincopy
File?outputfile?=?new?File("saved.png");?? ImageIO.write(bufferedImage,?"png",outputfile);?? 從BufferedImage對象中讀取像素數(shù)據(jù)的代碼如下:
[java]?view plaincopy
int?type=?image.getType();?? if?(?type?==BufferedImage.TYPE_INT_ARGB?||?type?==?BufferedImage.TYPE_INT_RGB?)?? ?????return?(int?[])image.getRaster().getDataElements(x,?y,?width,?height,?pixels?);?? else?? ????return?image.getRGB(?x,?y,?width,?height,?pixels,?0,?width?);?? 首先獲取圖像類型,如果不是32位的INT型數(shù)據(jù),直接讀寫RGB值即可,否則需要從Raster
對象中讀取。
?
往BufferedImage對象中寫入像素數(shù)據(jù)同樣遵守上面的規(guī)則。代碼如下:
[java]?view plaincopy
int?type=?image.getType();?? if?(?type?==BufferedImage.TYPE_INT_ARGB?||?type?==?BufferedImage.TYPE_INT_RGB?)?? ???image.getRaster().setDataElements(x,?y,?width,?height,?pixels?);?? else?? ???image.setRGB(x,?y,?width,?height,?pixels,?0,?width?);?? 讀取圖像可能因?yàn)閳D像文件比較大,需要一定時間的等待才可以,Java Advance Image
Processor API提供了MediaTracker對象來跟蹤圖像的加載,同步其它操作,使用方法如下:
[java]?view plaincopy
MediaTracker?tracker?=?new?MediaTracker(this);??? tracker.addImage(image_01,?1);??? tracker.waitForID(1,?10000)??? 從一個32位int型數(shù)據(jù)cARGB中讀取圖像RGB顏色值的代碼如下:
[java]?view plaincopy
int?alpha?=?(cARGB?>>?24)&?0xff;??? int?red?=?(cARGB?>>?16)?&0xff;?? int?green?=?(cARGB?>>?8)?&0xff;?? int?blue?=?cARGB?&?0xff;?? 將RGB顏色值寫入成一個INT型數(shù)據(jù)cRGB的代碼如下:
[java]?view plaincopy
cRGB?=?(alpha?<<?24)?|?(red<<?16)?|?(green?<<?8)?|?blue;?? 創(chuàng)建一個BufferedImage對象的代碼如下:
[java]?view plaincopy
BufferedImage?image?=?newBufferedImage(256,?256,?BufferedImage.TYPE_INT_ARGB);?? 一個完整的源代碼Demo如下:
[java]?view plaincopy
package?com.gloomyfish.swing;?? ?? import?java.awt.BorderLayout;?? import?java.awt.Dimension;?? import?java.awt.Graphics;?? import?java.awt.Graphics2D;?? import?java.awt.RenderingHints;?? import?java.awt.image.BufferedImage;?? import?java.io.File;?? import?java.io.IOException;?? ?? import?javax.imageio.ImageIO;?? import?javax.swing.JComponent;?? import?javax.swing.JFrame;?? ?? public?class?PlasmaDemo?extends?JComponent?{???? ???? ????? ? ???? ????private?static?final?long?serialVersionUID?=?-2236160343614397287L;???? ????private?BufferedImage?image?=?null;???? ????private?int?size?=?256;?? ???????? ????public?PlasmaDemo()?{???? ????????super();???? ????????this.setOpaque(false);???? ????}???? ???????? ????protected?void?paintComponent(Graphics?g)?{???? ????????Graphics2D?g2?=?(Graphics2D)g;???? ????????g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,?RenderingHints.VALUE_ANTIALIAS_ON);???? ????????g2.drawImage(getImage(),?5,?5,?image.getWidth(),?image.getHeight(),?null);???? ????}???? ???????? ????private?BufferedImage?getImage()?{???? ????????if(image?==?null)?{???? ????????????image?=?new?BufferedImage(size,?size,?BufferedImage.TYPE_INT_ARGB);???? ????????????int[]?rgbData?=?new?int[size*size];???? ????????????generateNoiseImage(rgbData);???? ????????????setRGB(image,?0,?0,?size,?size,?rgbData);?? ????????????File?outFile?=?new?File("plasma.jpg");?? ????????????try?{?? ????????????????ImageIO.write(image,?"jpg",?outFile);?? ????????????}?catch?(IOException?e)?{?? ????????????????e.printStackTrace();?? ????????????}?? ????????}???? ????????return?image;???? ????}???? ???????? ????public?void?generateNoiseImage(int[]?rgbData)?{???? ????????int?index?=?0;???? ????????int?a?=?255;???? ????????int?r?=?0;???? ????????int?g?=?0;???? ????????int?b?=?0;???? ??? ????????for(int?row=0;?row<size;?row++)?{???? ????????????for(int?col=0;?col<size;?col++)?{???? ?????????????????? ????????????????r?=?(int)(128.0?+?(128.0?*?Math.sin((row?+?col)?/?8.0)));???? ????????????????g?=?(int)(128.0?+?(128.0?*?Math.sin((row?+?col)?/?8.0)));???? ????????????????b?=?(int)(128.0?+?(128.0?*?Math.sin((row?+?col)?/?8.0)));???? ???????????????????? ????????????????rgbData[index]?=?((clamp(a)?&?0xff)?<<?24)?|???? ????????????????????????????????((clamp(r)?&?0xff)?<<?16)??|???? ????????????????????????????????((clamp(g)?&?0xff)?<<?8)???|???? ????????????????????????????????((clamp(b)?&?0xff));???? ????????????????index++;???? ????????????}???? ????????}???? ???????????? ????}???? ???????? ????private?int?clamp(int?rgb)?{???? ????????if(rgb?>?255)???? ????????????return?255;???? ????????if(rgb?<?0)???? ????????????return?0;???? ????????return?rgb;???? ????}?????? ???? ????public?void?setRGB(?BufferedImage?image,?int?x,?int?y,?int?width,?int?height,?int[]?pixels?)?{???? ????????int?type?=?image.getType();???? ????????if?(?type?==?BufferedImage.TYPE_INT_ARGB?||?type?==?BufferedImage.TYPE_INT_RGB?)???? ????????????image.getRaster().setDataElements(?x,?y,?width,?height,?pixels?);???? ????????else???? ????????????image.setRGB(?x,?y,?width,?height,?pixels,?0,?width?);???? ????}???? ???????? ????public?static?void?main(String[]?args)?{???? ????????JFrame?frame?=?new?JFrame("Noise?Art?Panel");???? ????????frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);???? ????????frame.getContentPane().setLayout(new?BorderLayout());???? ???????????? ?????????? ????????frame.getContentPane().add(new?PlasmaDemo(),?BorderLayout.CENTER);???? ????????frame.setPreferredSize(new?Dimension(400?+?25,450));???? ????????frame.pack();???? ????????frame.setVisible(true);???? ????}???? }????
轉(zhuǎn)載于:https://www.cnblogs.com/yang3wei/archive/2012/04/11/2739789.html
總結(jié)
以上是生活随笔為你收集整理的Java数字图像处理基础知识 - 必读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。