BufferedImage操作圖片筆記(轉)

來源:互聯網
上載者:User

標籤:

 BufferedImage是Image的一個子類,BufferedImage產生的圖片在記憶體裡有一個映像緩衝區,利用這個緩衝區我們可以很方便的操作這個圖片,通常用來做圖片修改操作如大小變換、圖片變灰、設定圖片透明或不透明等。

BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filePath));  

 

 

使圖片變灰

    使圖片變灰有兩種方法,一種是使用現成的類,一種是自己對每個像素進行操縱。

    使用現成的類ColorConvertOp,它的作用就是將一個顏色模式的圖片轉換為另一個顏色模式的圖片。顏色模式是諸如RGB顏色模式、灰階顏色模式等決定圖片色彩的東西,比如一副RGB顏色模式的圖片是彩色,但我們把它複製到一個灰階顏色模式的圖片上時,圖片就成灰色的了。

public BufferedImage getGrayPicture(BufferedImage originalImage)      {          BufferedImage grayPicture;          int imageWidth = originalImage.getWidth();          int imageHeight = originalImage.getHeight();                    grayPicture = new BufferedImage(imageWidth, imageHeight,                     BufferedImage.TYPE_3BYTE_BGR);          ColorConvertOp cco = new ColorConvertOp(ColorSpace                     .getInstance(ColorSpace.CS_GRAY), null);             cco.filter(originalImage, grayPicture);             return grayPicture;         }  

 

     自己操縱圖片的像素實現圖片變灰。圖片變灰的通用演算法:取出某個像素的r、g、b值,然後重新計算r、g、b值,計算公式為r=r*0.3+g*0.59+b*0.11,g=r,b=g,最後將該rgb值重新寫回像素。

      可以用下面三個函數

分別取出r、g、b。ColorModel是一個用來將圖片某點的rgb值轉化為r、g、b以及alpha等值的類。而bufferedImage本身只能取出一個完整的rgb值,無法分離單獨的r、g、b等值。

 

 

     bufferedImage.getColorModel().getRed(int pixel)

     bufferedImage.getColorModel().getGreen(int pixel)

 

     bufferedImage.getColorModel().getBlue(int pixel)

     但是這裡要注意的是使用這種方法取出r、g、b時,有可能彈出一個錯誤資訊——IllegalArgumentException: More than one component per pixel。通常當你使用這個方法操縱jpg等格式的圖片時會報這個錯誤。這是因為某些圖片如JPG格式的不支援使用單個int值的像素讀取rgb等資訊,應該使用Object類型的像素值進行讀取,也就是bufferedImage.getColorModel().getGreen(Object indata)

public BufferedImage getGrayPicture(BufferedImage originalImage)      {          int green=0,red=0,blue=0,rgb;          int imageWidth = originalImage.getWidth();          int imageHeight = originalImage.getHeight();          for(int i = originalImage.getMinX();i < imageWidth ;i++)              {                  for(int j = originalImage.getMinY();j < imageHeight ;j++)                  {  //圖片的像素點其實是個矩陣,這裡利用兩個for迴圈來對每個像素進行操作                      Object data = routeImage.getRaster().getDataElements(i, j, null);//擷取該點像素,並以object類型表示                      red = routeImage.getColorModel().getRed(data);                      blue = routeImage.getColorModel().getBlue(data);                      green = routeImage.getColorModel().getGreen(data);                      red = (red*3 + green*6 + blue*1)/10;                      green = red;                      blue = green;  /* 這裡將r、g、b再轉化為rgb值,因為bufferedImage沒有提供設定單個顏色的方法,只能設定rgb。rgb最大為8388608,當大於這個值時,應減去255*255*255即16777216 */                      rgb = (red*256 + green)*256+blue;                      if(rgb>8388608)                      {                          rgb = rgb - 16777216;                      }  //將rgb值寫回圖片      routeImage.setRGB(i, j, rgb);                  }                                }                       return originalImage;         }   

 

BufferedImage操作圖片筆記(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.