JAVA 图片处理详解

部署运行你感兴趣的模型镜像

一、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 控制器,作为网页验证码接口返回。
  • 如果需要中文验证码,修改字符集即可。

创作不易,点赞关注,持续更新!!!

 

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值