首先,图像处理基本操作为亮度,对比度,饱和度调整。亮度操作最为简单。计算机三原色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下其他方式读取。