<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java究竟怎么玩?

      天地程序已定棋,人間大數待變局

        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理

      Standard Widget Toolkit ( SWT ,標準窗口小部件工具箱),是在 Eclipse 平臺上使用的窗口小部件工具箱,它能向開發者提供和本機平臺一致的用戶界面和比較穩定的性能,也提供了強大的圖像處理功能。本文首先介紹 SWT 封裝的 Image , ImageData 等類,接著根據作者實際工作經驗給出了一些常見圖像處理的解決方法。

       

      SWT 圖像處理入門


      Standard Widget Toolkit ( SWT,標準窗口小部件工具箱),是在 Eclipse 平臺上使用的窗口小部件工具箱,它能向開發者提供和本機平臺一致的用戶界面和比較穩定的性能,也提供了強大的圖像處理功能。本文首先介紹 SWT 封裝的 Image, ImageData 等類,接著根據作者實際工作經驗給出了一些常見圖像處理的解決方法。

       


       

      SWT Images簡介

      軟件開發人員可以利用 SWT 封裝的 Image, ImageData 等類來創建圖像、存儲圖像數據,也可以對存儲的圖像數據進行各種圖像變換。本文將演示如何正確的使用 Image, ImageData 等類,以及如何使圖像變灰、變亮/黑、圖像旋轉、圖像拉伸、圖片透明疊加、圖片反色等相關問題。

      下面就來介紹一下 Image 和 ImageData 這兩個在 SWT Images 中最重要的類。

      類 org.eclipse.swt.graphics.Image 被用來表示可以在設備上顯示的圖片,可以用方法如GC.drawImage() 或者 Button.setImage() 等來將它顯示出來。Image 類提供了幾個構造函數,可以完成以下功能:

      • 裝載一個現有的圖象。可以通過傳入文件名或者 InputStream 作為參數,但是圖象的格式必須是它所支持的格式之(目前 SWT Image 支持 BMP、GIF、JPG、PNG、Windows ICO 等格式)一,否則會拋出 SWTException 異常。
      • 構造一個用已經存在的 ImageData 進行初始化的圖像。
      • 構造一個空圖像。可以通過修改其像素值或者向它拷貝一個 SWT 圖形上下文的內容 (GC) 來繪制該圖像,并且可以指定空圖像的大小。

      類 org.eclipse.swt.graphics.ImageData 中存儲了圖像的像素數據信息。 ImageData 是一個包含有關圖像大小、調色板、顏色值和透明度等信息的類。我們可以對這些圖像像素數據可以直接讀或者寫操作,這意味著可以通過直接讀取或者修改圖像的 數據,來設置或者取得圖像中任何像素或者任何一組像素的顏色值。關于 ImageData ,我們還應當了解以下一些字段:

      • width 和 height 指定圖像的寬和高。Depth 指定圖像的顏色深度。可能的值為 1、2、4、8、16、24 或者 32,指定編碼每一個像素的值所使用的比特數。
      • alpha 與 alphaData 定義圖像的透明度。alpha 定義了圖象的全局透明度值,默認值為 -1,否則 alphaData 域將被忽略。當 alpha 不等于 -1 時, alphaData 存儲了圖象的透明度緩沖區,每個像素可以有一個在 0~255 之間的透明度值,數值越大,表示越不透明。值得注意的是,只有部分圖象格式具有透明度,例如 GIF 和 PNG。
      • palette 包含一個 PaletteData 對象,它存儲有關圖像的顏色模型的信息。SWT 的顏色模型可以是索引或者直接的,由其域 isDirect 來指定。如果顏色模型是索引的,那么 PaletteData 包含顏色索引,可以通過方法 getRGBs() 來獲取 RGB 信息。如果它是直接的,那么它包含轉換信息,表明應當如何從像素的整數值中提取出顏色 RGB 成分。
      • data 包含像素值的字節緩沖區。字節編碼的方法取決于所使用的顏色深度。對于一個 8 位的圖像,數組中的一個字節正好表示圖像中一個像素的值。對于 16 位圖像,每一個像素值編碼為緩沖區中的兩個字節。這兩個字節以最低有效字節順序存儲。對于 24 或者 32 位圖像,每一個像素值以最高有效位字節順序編碼為緩沖區中的三個或者四個字節。
      • bytesPerLine 表明緩沖區中有多少字節用于表示圖像中一行像素的所有像素值。由于一個像素可能有多個字節表示,所以 bytesPerLine 可能是字段 width 值的若干倍。

       




       

       

      SWT圖象處理

      常見的圖象處理包含圖象的讀/寫、圖像變灰、變亮/黑、圖像旋轉、圖像拉伸、圖片透明疊加、圖片反色等。下面將就這些問題逐個介紹,表 1 列出了各個清單所對應的圖像處理。


      表 1. 示例代碼清單

      代碼清單 圖像處理類型
      清單 1 圖象的讀寫
      清單 2 圖像變灰
      清單 3 圖像變亮/變黑
      清單 4 圖像旋轉
      清單 5 圖像反色
      清單 6 圖像拉伸
      清單 7 圖片透明疊加

       

      圖像的讀寫

      我們可以使用類 org.eclipse.swt.graphics.ImageLoader 來加載或者保存圖像。 ImageLoader 具有一個全局的成員變量 ImageData[],它用于存儲圖片數據。


      清單 1. 圖像讀寫示例

      String fileName = "source.jpg";
      String saveName = "saved.jpg";
      ImageLoader loader = new ImageLoader();
      ImageData[] imageData = loader.load(fileName);
      if(imageData.length > 0){
      Image newImage = new Image(null, imageData[0]);
      //對newImage進行操作
      ...
      loader.data[0] = newImage.getImageData();
      loader.save(saveName, SWT.IMAGE_BMP);
      }

       

      圖像變灰

      圖像變灰在桌面應用程序中有著廣泛的應用。例如,一個圖標被作為一個按鈕的背景,我們需要一個灰色效果的圖標作為按鈕的背景來表示這個按鈕處于禁用 狀態。在SWT中,基于已經存在的圖像來創建一個具有灰色效果的圖像,我們可以使用構造函數 Image(Display display, Image image, int flag) 來創建,其中參數 flag 使用 SWT.IMAGE_GRAY。


      清單2. 圖像變灰示例

      Image newImage = new Image(null, image, SWT.IMAGE_GRAY);

       

      圖像變亮/變黑

      下面討論圖像變亮/變黑。 RGB 和 HSL (也叫 HSB/HSV )是兩種色彩空間,即:紅、綠、藍( Red, Green, Blue) 和色調、飽和度、亮度( Hue, Saturation, Lightness 或 Brightness 或 Value),前者適用于機器采樣,目前的顯示器顏色即由這三種基色構成,而后者更符合人類的直觀感覺。在 Windows 的標準顏色對話框中均包含這兩種表示方法。 RGB 的取值范圍在 0~255 之間, HSL 的取值在 0~1 之間。因此我們只需要將 HSL 空間數據的 L 分量進行調整即可調整此圖像的亮度。要實現圖像變亮/變黑的功能,只需要調整清單 3 中函數 lightImage 行(*)中等號右邊的值( 0 到 1 之間)。


      清單 3. 圖像變亮示例

      private static ImageData lightImage(ImageData srcData) {
      double[] data = rgbTohsl(srcData.data);
      byte[] newData = new byte[srcData.data.length];
      int bytesPerPixel = srcData.bytesPerLine / srcData.width;
      int destBytesPerLine = srcData.width * bytesPerPixel;
      for(int i = 0; i < data.length; i += 3) {
      data[i + 2] = 0.75; ----------------- (*)
      }
      data = hslTorgb(data);
      for(int i = 0; i < srcData.data.length; i ++) {
      newData[i] = (byte)data[i];
      }
      ImageData newImageData = new ImageData(srcData.width, srcData.height,
      srcData.depth,srcData.palette, destBytesPerLine, newData);
      return newImageData;
      }

       

      其中,方法 double[] rgbTohsl(byte[] data) 是把 RGB 空間數據轉換到 HSL 空間;相反的,方法 double[] hslTorgb(double[] data) 是把數據從 HSL 空間轉換到 RGB 空間。

      圖像旋轉

      清單4中方法 rotate 實現了將圖像相左旋轉 90 度。如圖 1 ,對于像素點 (x, y) ,向左旋轉90 度以后,它在圖象中的位置變成了 (y, width - x - 1) 。因此,相左旋轉 90 度即將所有的像素點按照規則換一下位置。其他的旋轉可用同樣的方法。


      圖1 旋轉前與相左旋轉 90 度后
      旋轉前與相左旋轉 90 度后

      清單4. 圖像旋轉示例

      private static ImageData rotate(ImageData srcData) {
      int bytesPerPixel = srcData.bytesPerLine / srcData.width;
      int destBytesPerLine = srcData.height * bytesPerPixel;
      byte[] newData = new byte[srcData.data.length];
      int width = 0, height = 0;
      for (int srcY = 0; srcY < srcData.height; srcY++) {
      for (int srcX = 0; srcX < srcData.width; srcX++) {
      int destX = 0, destY = 0, destIndex = 0, srcIndex = 0;
      destX = srcY;
      destY = srcData.width - srcX - 1;
      width = srcData.height;
      height = srcData.width;
      destIndex = (destY * destBytesPerLine) + (destX * bytesPerPixel);
      srcIndex = (srcY * srcData.bytesPerLine) + (srcX * bytesPerPixel);
      System.arraycopy(srcData.data, srcIndex, newData, destIndex, bytesPerPixel);
      }
      }

      return new ImageData(width, height, srcData.depth, srcData.palette,
      destBytesPerLine, newData);
      }

       

      圖像反色

      對于彩色圖像的 R、G、B 各彩色分量取反的技術就是圖像的反色處理,這在處理二值化圖像的連通區域選取的時候非常重要。如物體連通域用黑色表示,而二值化后的物體連通域圖像可那是 白色的,而背景是黑色的,這時應手動選取圖像的反色處理或有程序根據背景和物體連通域兩種顏色的數量所占比例而自動選擇是否選擇選取圖像的反色處理,其算 法很簡單,假設源圖像一像素的紅,綠,藍分量為 (R,G,B),則目標圖像該像素的紅綠藍分量應變為 (255 - R,255 - G, 255 - B)。


      清單5. 圖像反色示例

      private static ImageData reverseImage(ImageData srcData)
      {
      int bytesPerPixel = srcData.bytesPerLine / srcData.width;
      int destBytesPerLine = srcData.width * bytesPerPixel;
      byte[] newData = srcData.data;

      for (int i = 0; i < newData.length; i ++)
      newData[i] = (byte) (255 - newData[i]);
      ImageData newImageData = new ImageData(srcData.width, srcData.height,
      srcData.depth, srcData.palette, destBytesPerLine, newData);
      newImageData.transparentPixel = srcData.transparentPixel;

      return newImageData;
      }

       

      圖像拉伸

      圖像的縮小/放大一般分為按比例縮小和不按比例縮小兩種。圖像的縮小操作中,是在現有的信息里如何挑選所需要的有用信息。圖像的放大操作中,則需對 尺寸放大后所多出來的空格填入適當的值,這是信息的估計問題,所以較圖像的縮小要難一些,而且圖像大比例放大時經常會出現馬賽克效應。慶幸的是,SWT 工具箱對圖像的拉伸進行了封裝,開發者只需要調用方法 ImageData.scaledTo(int width, int height) 來獲得一個拉伸后的 ImageData。


      清單6. 圖像拉伸示例

      Image newImage = new Image(null, imageData[0].scaledTo(imageData[0].width / 2,
      imageData[0].height / 2));

       

      圖片透明疊加

      透明疊加方式是圖象處理中常用的一種處理方式,在這種處理方式中,一幅圖片疊加到另一幅圖片上,但是這幅圖象不是完全將原來的圖象覆蓋,而是能夠部 分的透過疊加的圖象顯示出來,透明的程度由透明度參數指定(假定為 a,其值在 0 與 1 之間,數值越小表明被疊加的圖片越透明),其原理是目標圖片的 R、G、B 以及 alpha 分別為待疊加圖片 1 的 R、G、B 以及 alpha 分量乘以透明度參數 a 加上待疊加圖片 2 的 R、G、B 以及 alpha 分量乘以 1-a 的值。我們可以使用圖片的透明疊加作出水印的效果。


      清單7. 圖像透明疊加示例

      private static ImageData watermark(ImageData srcData1, ImageData srcData2, double alpha) {
      if(srcData1.width != srcData2.width || srcData1.height !=
      srcData2.height || rcData1.bytesPerLine != srcData2.bytesPerLine)
      //未考慮不同大小圖片的疊加
      return null;
      int bytesPerPixe = srcData1.bytesPerLine / srcData1.width;
      int destBytesPerLine = srcData1.width * bytesPerPixe;
      byte[] newData = new byte[srcData1.data.length];

      ImageData newImageData = new ImageData(srcData1.width, srcData1.height, srcData1.depth,
      srcData1.palette, destBytesPerLine, newData);
      for (int srcY = 0; srcY < srcData1.height; srcY++) {
      for (int srcX = 0; srcX < srcData1.bytesPerLine; srcX++) {
      int idx = srcY * srcData1.bytesPerLine + srcX;
      newImageData.data[idx] = (byte)(alpha * srcData1.data[idx] +
      (1- alpha) * srcData2.data[idx]);
      }
      }
      return newImageData;
      }

       

      需要說明的是,以上所列舉的清單中大部分都沒有對透明度數據進行處理,讀者如對帶有透明度數據圖片進行處理的時候,可自行添加相關代碼,其處理過程跟對 ImageData 數據處理過程類似。

       




       

       

      結論

      從上面的介紹中,可以知道 SWT 對 Image 的支持非常好,開發者可以方便的對圖象進行各種操作。對于想用 Java 來進行圖像處理的編程人員來說, SWT Images 是一個不可多得選擇。

       

      posted on 2009-03-22 16:50  cping  閱讀(457)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品亚洲综合色区丝瓜 | 中文字幕免费不卡二区| 免费无码成人AV片在线| 天天爽夜夜爽人人爽一区二区| 亚洲综合伊人五月天中文| 久久精品丝袜高跟鞋| 国产高颜值极品嫩模视频| 亚洲精品日韩在线观看| 成人午夜无人区一区二区| 亚洲色成人网站www永久四虎| 亚洲码与欧洲码区别入口| 在线观看成人av天堂不卡| 日韩免费码中文在线观看| 91精品国产自产91精品| 国产成人欧美一区二区三区在线| 少妇爽到呻吟的视频| 丝袜美腿视频一区二区三区| 欧美寡妇xxxx黑人猛交| 国产jjizz女人多水喷水| 亚洲精品中文字幕第一页| 连城县| 久久免费偷拍视频有没有| 久99久热这里只有精品| 中文字幕国产精品日韩| 四虎永久在线精品无码视频| 99久久夜色精品国产亚洲| 污网站在线观看视频| 99国产精品白浆在线观看免费 | 乱码精品一区二区三区| 2020久久国产综合精品swag| 麻豆a级片| 亚洲成av人片乱码色午夜| 日日碰狠狠躁久久躁96avv| 国模肉肉视频一区二区三区| 国产精品线在线精品| 国产精品高潮无码毛片| 国产福利社区一区二区| 18国产午夜福利一二区| 综合久久婷婷综合久久| 亚洲人成网站在线播放动漫| 日本高清中文字幕免费一区二区 |