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图像处理)