Java图像处理之亮度调整
生活随笔
收集整理的這篇文章主要介紹了
Java图像处理之亮度调整
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先,圖像處理基本操作為亮度,對比度,飽和度調整。亮度操作最為簡單。計算機三原色R(0~255)G(0~255)B(0~255),一個像素的色彩就是由RGB值組合渲染而成。因此,一些基本的圖像處理就是對像素上RGB值進行操作。
個人簡單研究了下使用Java處理JPG格式圖像,這里簡單記錄下使用Java對圖像進行亮度調整。第一步,讀取圖片,使用ImageIO.read()讀取圖片,返回一個BufferedImage對象;
BufferedImage image = ImageIO.read(file);第二步,先從image中取出每一個像素值rgb,再從rgb上取出R,G,B每個分量,分別進行操作后重新裝入rgb(注意:由于RGB值為0~255之間,操作過程中可能出現數值超限,需要通過一個clamp方法判斷,大于255則返回255,小于0則返回0);
int rgb,R,G,B; for (int i = 0; i < bImage.getWidth(); i++) {for (int j = 0; j < bImage.getHeight(); j++) {rgb = bImage.getRGB(i, j);R = ((rgb >> 16) & 0xff)+ param;G = ((rgb >> 8) & 0xff) + param;B = (rgb & 0xff) + param;rgb = (255 & 0xff) << 24) | ((clamp(R) & 0xff) << 16) | ((clamp(G) & 0xff) << 8) | ((clamp(B) & 0xff));bImage.setRGB(i, j, rgb);} }判斷RGB值是否超限的clamp方法如下:
private int clamp(int rgb) {if (rgb > 255)return 255;if (rgb < 0)return 0;return rgb;}第三步,通過ImageIO.write()方法把處理后的image保存到新文件;
ImageIO.write(image,"JPG",file);完整的DEMO如下:
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;import javax.imageio.ImageIO;public class LumAdjust {/*** 圖片亮度調整* @param image* @param param* @throws IOException*/public void lumAdjustment(BufferedImage image, int param) throws IOException {if (image == null) {return;} else {int rgb, R, G, B;for (int i = 0; i < image.getWidth(); i++) {for (int j = 0; j < image.getHeight(); j++) {rgb = image.getRGB(i, j);R = ((rgb >> 16) & 0xff) + param;G = ((rgb >> 8) & 0xff) + param;B = (rgb & 0xff) + param;rgb = ((clamp(255) & 0xff) << 24) | ((clamp(R) & 0xff) << 16) | ((clamp(G) & 0xff) << 8)| ((clamp(B) & 0xff));image.setRGB(i, j, rgb);}}}}// 判斷a,r,g,b值,大于256返回256,小于0則返回0,0到256之間則直接返回原始值private int clamp(int rgb) {if (rgb > 255)return 255;if (rgb < 0)return 0;return rgb;}public static void main(String[] args) throws IOException {File file = new File("E:/桌面/test/1.JPG");BufferedImage image = ImageIO.read(file);LumAdjust lumAdjust = new LumAdjust();lumAdjust.lumAdjustment(image, 30);File file2 = new File("E:/桌面/test/2.JPG");file2.createNewFile();ImageIO.write(image, "JPG", file2); } }?原圖:
亮度增加30后效果:
需要注意的是,ImageIO.read()只讀取了JPG圖片的色彩信息,即aRGB數據,a(0~255)為透明通道,因此BufferedImage對象中不包含原始JPG圖像其他屬性信息,如相機型號,品牌,拍攝時間,GPS位置信息等,因此處理后圖像會丟失部分信息,保存路徑不建議覆蓋原圖。如果需要保留圖片屬性要通過ImageIO下其他方式讀取。
總結
以上是生活随笔為你收集整理的Java图像处理之亮度调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录第一次部署servlet实例
- 下一篇: 三维GIS开发——WorldWindJa