J2SE - Graphics和BufferedImage的图形图像处理示例

本文通过J2SE的Graphics和BufferedImage类,详细介绍了如何处理图形图像,包括修改背景颜色、图片叠加、缩放裁剪、平移旋转、添加水印和灰度处理、创建水平镜像、切割圆角、读写RGB值以及将图片转换为TIF格式。
摘要由CSDN通过智能技术生成

一、绘制图形图像

/**
 *	线段 / 折线
 */
public static void drawLine() throws IOException {
	// 创建图像缓冲区(空图片)
	BufferedImage bi = new BufferedImage(512, 512, BufferedImage.TYPE_INT_RGB);
			
    // 创建 Graphics 的副本
    Graphics2D g2d = bi.createGraphics();

    // 抗锯齿
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
    // 设置画笔颜色
    g2d.setColor(Color.RED);

    // 1. 两点绘制线段: 点(20, 50), 点(200, 50)
    g2d.drawLine(50, 50, 200, 50);

    // 2. 多点绘制折线: 点(50, 100), 点(100, 130), 点(150, 70), 点(200, 100)
    int[] xPoints = new int[] { 50, 100, 150, 200 };
    int[] yPoints = new int[] { 100, 120, 80, 100 };
    int nPoints = 4;
    g2d.drawPolyline(xPoints, yPoints, nPoints);

    // 3. 两点绘制线段(设置线宽为5px): 点(50, 150), 点(200, 150)
    BasicStroke bs1 = new BasicStroke(5);       // 笔画的轮廓(画笔宽度/线宽为5px)
    g2d.setStroke(bs1);
    g2d.drawLine(50, 150, 200, 150);

    // 4. 绘制虚线: 将虚线分为若干段( 实线段 和 空白段 都认为是一段), 实线段 和 空白段 交替绘制,
    //             绘制的每一段(包括 实线段 和 空白段)的 长度 从 dash 虚线模式数组中取值(从首
    //             元素开始循环取值), 下面数组即表示每段长度分别为: 5px, 10px, 5px, 10px, ...
    float[] dash = new float[] { 5, 10 };
    BasicStroke bs2 = new BasicStroke(
            1,                      // 画笔宽度/线宽
            BasicStroke.CAP_SQUARE,
            BasicStroke.JOIN_MITER,
            10.0f,
            dash,                   // 虚线模式数组
            0.0f
    );
    g2d.setStroke(bs2);
    g2d.drawLine(50, 200, 200, 200);

    // 自己创建的副本用完要销毁掉
    g2d.dispose();
    
    // 保存文件
    ImageIO.write(bi, "png", new File("F:/Tst/test-res.png"));
}

/**
 *	矩形 / 多边形
 */
public static void drawRect() throws IOException {
	// 创建图像缓冲区(空图片)
	BufferedImage bi = new BufferedImage(512, 512, BufferedImage.TYPE_INT_RGB);
			
    // 创建 Graphics 的副本
    Graphics2D g2d = bi.createGraphics();

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(Color.GRAY);

    // 1. 绘制一个矩形: 起点(30, 20), 宽80, 高100
    g2d.drawRect(30, 20, 80, 100);

    // 2. 填充一个矩形
    g2d.fillRect(140, 20, 80, 100);

    // 3. 绘制一个圆角矩形: 起点(30, 150), 宽80, 高100, 圆角宽30, 圆角高30
    g2d.drawRoundRect(30, 150, 80, 100, 30, 30);

    // 4. 绘制一个多边形(收尾相连): 点(140, 150), 点(180, 250), 点(220, 200)
    int[] xPoints = new int[] { 140, 180, 220};
    int[] yPoints = new int[] { 150,  250, 200};
    int nPoints = 3;
    g2d.drawPolygon(xPoints, yPoints, nPoints);
    
    // 绘制一个3D矩形(左上或者右下的边框高亮实现的3D)
    g2d.draw3DRect(300, 300, 80, 80, false);
    // 填充一个3D矩形(左上或者右下的边框高亮实现的3D)
    g2d.fill3DRect(400, 400, 80, 80, false);

    g2d.dispose();
    
    // 保存文件
    ImageIO.write(bi, "png", new File("F:/Tst/test-res.png"));
}

/**
 *	圆弧 / 扇形
 */
public static void drawArc() throws IOException {
	// 创建图像缓冲区(空图片)
	BufferedImage bi = new BufferedImage(512, 512, BufferedImage.TYPE_INT_RGB);
			
    // 创建 Graphics 的副本
    Graphics2D g2d = bi.createGraphics();

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(Color.RED);

    // 1. 绘制一条圆弧: 椭圆的外切矩形 左上角坐标为(0, 0), 宽100, 高100,
    //                弧的开始角度为0度, 需要绘制的角度数为-90度,
    //                椭圆右边水平线为0度, 逆时针为正角度, 顺时针为负角度
    g2d.drawArc(0, 0, 100, 100, 0, -90);

    // 2. 绘制一个圆: 圆的外切矩形 左上角坐标为(120, 20), 宽高为100
    g2d.drawArc(120, 20, 100, 100, 0, 360);

    g2d.setColor(Color.GRAY);

    // 3. 填充一个扇形
    g2d.fillArc(80, 150, 100, 100, 90, 270);

    g2d.dispose();
    
    // 保存文件
    ImageIO.write(bi, "png", new File("F:/Tst/test-res.png"));
}

/**
 *	椭圆 (实际上通过绘制360度的圆弧/扇形也能达到绘制圆/椭圆的效果)
 */
public static void drawOval() throws IOException {
	// 创建图像缓冲区(空图片)
	Buff
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值