日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時間:2024/4/17 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);?//?加入要跟蹤的BufferedImage對象image_001??
  • tracker.waitForID(1,?10000)?//?等待10秒,讓iamge_01圖像加載??

  • 從一個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++)?{????
  • ????????????????//?set?random?color?value?for?each?pixel????
  • ????????????????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());????
  • ????????????
  • ????????//?Display?the?window.????
  • ????????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)容還不錯,歡迎將生活随笔推薦給好友。