Java Graphics2D类的绘图方法

Graphics2D继承自Graphics,它扩展了Graphics的绘图功能,拥有更强大的二维图形处理能力,提供对几何形状、坐标转换、颜色管理以及文字布局等更精确的控制。

Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式,设定平移、旋转、缩放或修剪变换图形,以及设定填充图形的颜色和图案等。

图形状态属性用特定的对象存储。

自己上源码看例子:

    /**
     * 图片添加水印方法
     * @param srcImgPath 源图片的路径
     * @param outImgPath 目标输出图片路径
     * @param words 水印的文字
     * @param wordsColor 设置水印文字的颜色
//     * @param wordFont 设置水印文字字体格式
     * @param picSuffix 设置输出图片后缀
     */
    public static void stamp(String srcImgPath, String outImgPath, String words, Color wordsColor, String picSuffix) {
        try {

            File srcImgFile = new File(srcImgPath); // 读取原图片文件内容
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);

            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);//准备设置水印效果
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            g.setColor(wordsColor); //设置图片水印颜色
            Font wordFont = new Font("微软雅黑", Font.ITALIC,(srcImgHeight+srcImgWidth)/50);
            g.setFont(wordFont);//设置水印文字字体格式
            g.rotate(Math.toRadians(45), srcImgWidth / 2, srcImgHeight / 2); //设置倾斜45度
//            int x = srcImgWidth - g.getFontMetrics(g.getFont()).charsWidth(words.toCharArray(), 0, words.length()) - 3;
//            int y = srcImgHeight - 3;
            //获取整个字符串长度
            FontMetrics fm = sun.font.FontDesignMetrics.getMetrics(wordFont);
            int i = fm.stringWidth(words);
            int start= (srcImgWidth - i) / 2;

            int charWidth1 = 2;
            int halfGap = 4;
//            int x = (srcImgWidth - words.length() * charWidth1) / 40;
            int y = (srcImgHeight - (charWidth1 + halfGap)) / 2;
            g.drawString(words, start, y);
            g.dispose();

            FileOutputStream outImgStream = new FileOutputStream(outImgPath);//输出图片路径
            ImageIO.write(bufImg,picSuffix, outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

常用绘图属性

stroke属性

我们可以调用调用如下方法来设置stroke属性:
public abstract void setStroke(Stroke s)

stroke属性用于控制线条的宽度、笔形样式、线段连接方式或短划线图案。

如果我们要设置stroke属性,则应当先创建Stroke引用的对象,但由于Stroke为接口类型,所以我们要创建对象,可以创建其已知实现类BasicStroke的对象。

BasicStroke常用的构造方法有:
// 构造一个具有指定属性的实心的 BasicStroke
public BasicStroke(float width, int cap, int join)

// 构造一个具有指定线条宽度以及 cap 和 join 风格为默认值的实心 BasicStroke
public BasicStroke(float width)

cap是端点样式,可取值为:CAP_BUTT(无修饰),CAP_ROUND(半径等于画笔宽度一半的圆形装饰末端),CAP_SQUARE(正方形末端,默认值)。

join是用于定义两线段交汇处的连接方式:JOIN_BEVEL(无修饰),JOIN_MITER(尖形末端,默认值),JOIN_ROUND(圆形末端)。

clip属性

clip属性用于实现剪裁效果。设置剪裁属性可调用如下方法确定剪裁区的Shape:
public abstract void setClip(int x, int y, int width, int height)

连续多个setClip()得到它们交集的剪裁区。

paint属性

paint属性控制填充效果,通过调用setPaint()方法设置:
public abstract void setPaint(Paint paint)

paint可以同时作用在边线和填充上,可以是单色,渐变和图案,任何paint都需要实现java.awt.Paint接口。因为Color类实现了java.awt.Paint接口,所有的Color对象都是Paint对象。

 

GradientPaint类:
public GradientPaint(float x1, float y1, Color color1,
float x2, float y2, Color color2)

这个类用颜色渐变填充一个区域,构造函数指定定比例和颜色。图形引擎会从第一个点到第二个点之间线性变化两个颜色:从(x1,y1)到(x2,y2)颜色从c1渐变到c2。我们还可以指定颜色图案是否允许重复。

 

TexturePaint类:
public TexturePaint(BufferedImage txtr, Rectangle2D anchor)

这个类平铺一个图像来填充图形,构造函数接收一个java.awt.image.BufferedImage和一个Rectangle2D,把图像影射到矩形里,然后平铺矩形。

我们可以先创建GradientPaint类或TexturePaint类的对象,再调用Graphics2D的setPaint()方法设置填充效果。

Font属性

所有的文本都使用能表现文字的样式图形渲染。当前的字体决定了字体的形状。使用继承自java.awt.Graphics的getFont()方法和setFont()方法来操纵字体。尽管设置字体相对简单的工作,Java 2D还是为文本描绘提供了丰富的选项。

Transform属性

transform属性用来实现常用的图形平移、缩放和斜切等变换操作。我们可以调用setTransform()来设置transform属性:
public abstract void setTransform(AffineTransform Tx)

该方法需要一个AffineTransform对象的参数,所以首先创建AffineTransform对象,然后调用setTransform()方法设置transform属性。最后,用具有指定属性的Graphics2D对象绘制图形。

创建AffineTransform对象的方法有:
// 旋转变换,旋转theta弧度
public static AffineTransform getRotateInstance(double theta)

// 绕旋转中心(anchorx, anchory)旋转
public static AffineTransform getRotateInstance(double theta, double anchorx,
double anchory)

// 缩放变换,x和y方向分别按sx,sy比例变换
public static AffineTransform getScaleInstance(double sx, double sy)

// 错切变换,shx和shy指定斜拉度
public static AffineTransform getShearInstance(double shx, double shy)

// 平移变换,tx和ty表示x和y方向平移距离
public static AffineTransform getTranslateInstance(double tx, double ty)

当然,也可以先创建一个没有transform属性的AffineTransform对象,然后用以下方法指定图形平移、旋转、缩放变换属性:
// 将图形在x轴方向平移tx像素,y轴方向平移ty像素
public void translate(double tx, double ty)

// 旋转theta弧度
public void rotate(double theta)

// 图形以点(anchorx, anchory)为轴点,旋转theta弧度
public void rotate(double theta, double anchorx, double anchory)

// 图形在x轴方向缩放sx倍,纵向缩放sy倍
public void scale(double sx, double sy)

composit属性

composit属性设置图形重叠区域的效果。可通过调用setComposite()方法设置该属性:
public abstract void setComposite(Composite comp)

例如先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite对象,再通过setComposite()方法设置混合效果。AlphaComposite在图形和图像中实现混合和透明效果,Alpha值的范围为0.0f(完全透明)-1.0f(完全不透明)。

 

使用Graphics2D绘图

Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。常用的主要有:
?Line2D - 线段类
?RoundRectangle2D - 圆角矩形类
?Ellipse2D - 椭圆类
?Arc2D - 圆弧类
?QuadCurve2D - 二次曲线类
?CubicCurve2D - 三次曲线类。

要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态内部类构造方法Double()或Float()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。

画一条线段:
/* 画线 */
Stroke s = new BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g2d.setStroke(s);
Line2D line = new Line2D.Double(30,50,100,200);
g2d.draw(line);

画一个圆角矩形:
/* 画圆角矩形 */
g2d.setColor(Color.BLUE);
RoundRectangle2D rect = new RoundRectangle2D.Double(100, 50, 100, 50,
4, 4);
g2d.draw(rect);

画一个旋转一定角度的矩形:
/* 画旋转一定角度的矩形 */
Rectangle2D rect2 = new Rectangle2D.Double(60, 160, 60, 90);
AffineTransform transform = new AffineTransform();
transform.rotate(45 * Math.PI / 180, 90, 200); // 围绕(90,200)点旋转图形45度
g2d.setTransform(transform);
g2d.draw(rect2);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wsxlgg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值