一、Java标准库图片处理类
1. BufferedImage
包名: java.awt.image
作用:
BufferedImage 是 Java 标准库中最常用的图片处理类。它表示一张图片,并允许直接访问和操作像素数据。
常用方法:
getWidth()/getHeight():获取宽高。getRGB(x, y):获取某个像素的 RGB 值。setRGB(x, y, rgb):设置某个像素的 RGB 值。getRaster():获取像素栅格,可用于更高级的像素处理。
示例:
BufferedImage image = ImageIO.read(new File("input.jpg"));
int rgb = image.getRGB(100, 100); // 获取(100,100)处像素
image.setRGB(100, 100, 0xFF00FF); // 修改为紫色
ImageIO.write(image, "jpg", new File("output.jpg"));
2. ImageIO
包名: javax.imageio
作用:
负责图片的读写操作,支持多种格式(jpg、png、bmp、gif等)。
常用方法:
read(File/InputStream):读取图片为BufferedImage。write(BufferedImage, formatName, File):写出图片。
示例:
BufferedImage img = ImageIO.read(new File("test.png"));
ImageIO.write(img, "jpg", new File("test_out.jpg"));
3. Graphics2D
包名: java.awt
作用:
用于在图片上绘制、变换、处理图形。常用于加水印、绘制文字、旋转缩放图片等。
常用方法:
drawImage():绘制图片。drawString():绘制文字。setColor()/setFont():设置颜色和字体。rotate()/scale():旋转和缩放。
示例:
BufferedImage img = new BufferedImage(300, 200, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, 300, 200);
g2d.setColor(Color.RED);
g2d.drawString("Hello Java!", 50, 100);
g2d.dispose();
ImageIO.write(img, "png", new File("hello.png"));
二、主流第三方图片处理库
1. Thumbnailator
特点:
轻量级、易用的图片缩放和裁剪库,API 友好。
常用功能:
- 图片缩放、裁剪
- 图片格式转换
- 图片旋转
示例:
Thumbnails.of("input.jpg")
.size(200, 300)
.rotate(90)
.outputFormat("png")
.toFile("output.png");
2. ImageJ
特点:
功能强大,支持复杂的图像分析和处理,常用于科研和医学领域。
常用功能:
- 图像滤波、分割、分析
- 支持多种图像格式
- 插件丰富
示例:
ImagePlus img = IJ.openImage("test.jpg");
IJ.run(img, "Gaussian Blur...", "sigma=2");
img.show();
3. OpenCV (Java接口)
特点:
跨平台,支持复杂的图像处理和计算机视觉算法。
常用功能:
- 边缘检测、滤镜
- 特征识别
- 图像变换
示例:
Mat src = Imgcodecs.imread("input.jpg");
Mat dst = new Mat();
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("output.jpg", dst);
三、常见图片处理操作举例
1. 图片缩放
BufferedImage src = ImageIO.read(new File("input.jpg"));
Image scaled = src.getScaledInstance(100, 100, Image.SCALE_SMOOTH);
BufferedImage dst = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g = dst.createGraphics();
g.drawImage(scaled, 0, 0, null);
g.dispose();
ImageIO.write(dst, "jpg", new File("scaled.jpg"));
2. 图片裁剪
BufferedImage src = ImageIO.read(new File("input.jpg"));
BufferedImage subImg = src.getSubimage(50, 50, 100, 100); // 从(50,50)裁剪100x100
ImageIO.write(subImg, "jpg", new File("cropped.jpg"));
3. 图片加水印
BufferedImage src = ImageIO.read(new File("input.jpg"));
Graphics2D g = src.createGraphics();
g.setFont(new Font("Arial", Font.BOLD, 36));
g.setColor(new Color(255, 0, 0, 128)); // 半透明红色
g.drawString("Watermark", 50, 50);
g.dispose();
ImageIO.write(src, "jpg", new File("watermarked.jpg"));
四、总结与建议
- 标准库适合简单图片处理,如读取、写入、基本像素操作、绘制等。
- 第三方库适合复杂需求,如批量处理、滤镜、分析、优化性能等。
- 若处理大图片或高性能需求,建议使用 OpenCV 或 ImageJ。
- 若只需简单缩放、裁剪,推荐 Thumbnailator。
- 了解像素操作和绘制原理有助于自定义更复杂的效果。
五、使用图片处理类生成验证码示例
Java生成验证码图片示例
1. 完整代码
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;
public class CaptchaGenerator {
// 验证码字符集
private static final String CHAR_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int WIDTH = 160;
private static final int HEIGHT = 50;
private static final int CODE_LENGTH = 5;
public static void main(String[] args) throws Exception {
// 生成验证码字符串
String code = generateCode(CODE_LENGTH);
// 创建图片
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 背景填充
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
// 画干扰线
Random rand = new Random();
for (int i = 0; i < 12; i++) {
g.setColor(new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)));
int x1 = rand.nextInt(WIDTH);
int y1 = rand.nextInt(HEIGHT);
int x2 = rand.nextInt(WIDTH);
int y2 = rand.nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
// 写验证码字符
g.setFont(new Font("Arial", Font.BOLD, 36));
for (int i = 0; i < CODE_LENGTH; i++) {
g.setColor(new Color(rand.nextInt(150), rand.nextInt(150), rand.nextInt(150)));
// 随机旋转
double theta = (rand.nextInt(60) - 30) * Math.PI / 180;
g.rotate(theta, 30 * i + 20, 35);
g.drawString(String.valueOf(code.charAt(i)), 30 * i + 20, 35);
g.rotate(-theta, 30 * i + 20, 35);
}
g.dispose();
// 保存图片
ImageIO.write(image, "png", new File("captcha.png"));
// 打印验证码文本
System.out.println("验证码内容为: " + code);
}
// 随机生成验证码字符串
private static String generateCode(int length) {
Random rand = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(CHAR_STRING.charAt(rand.nextInt(CHAR_STRING.length())));
}
return sb.toString();
}
}
2. 说明
- 验证码内容:随机生成 5 位字符(可自定义长度和字符集)。
- 干扰线:增加识别难度,防止机器轻易识别。
- 字符随机旋转和颜色:进一步增加防刷难度。
- 保存图片:保存为
captcha.png,也可以改为输出到OutputStream。
3. 扩展建议
- 可以增加噪点、扭曲效果,进一步提升安全性。
- 可集成到 Servlet 或 Spring Boot 控制器,作为网页验证码接口返回。
- 如果需要中文验证码,修改字符集即可。
创作不易,点赞关注,持续更新!!!
1万+

被折叠的 条评论
为什么被折叠?



