精华内容
下载资源
问答
  • graphics2d
    千次阅读
    2021-03-08 09:12:17

    这篇文章主要给大家讲述关于Java中Graphics2D类的使用操作解析,通俗易懂的说明,快跟随爱站技术频道的小编一起来了解下其中的详情吧。

    绘图属性

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

    1. stroke属性

    stroke属性控制线条的宽度、笔形样式、线段连接方式或短划线图案。该属性的设置需要先创建BasicStroke对象,再调用setStroke()方法来设置。创建BasicStroke对象的方法有:

    BasicStroke(float w):指定线条宽w。

    BasicStroke(float w,int cap, int join):

    cap是端点样:CAP_BUTT(无修饰),CAP_ROUND(半圆形末端),CAP_SQUARE(方形末端,默认值)。

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

    2. paint属性

    paint属性控制填充效果。先调用以下方法确定填充效果,理用setPaint()方法设置。

    GradientPaint(float x1,float y1,Color c1,float x2,flaot y2,Color c2):从(x1,y1)到(x2,y2)颜色从c1渐变到c2。其中:参数c1,c2决定这个渐变色是从颜色c1渐变到颜色c2。参数x1,y1,x2,y2决定了渐变的强弱,即要求从点(x1,y1)出发到达点(x2,y2),颜色从c1变成c2。

    GradientPaint(float x1,float y1,Color c1,float x2,float y2,Color c2,Boolean cyclic):如果希望渐变到终点又是起点的颜色,应将cyclic设置为true。

    3. transform属性

    transform 属性用来实现常用的图形平移、缩放和斜切等变换操作。首先创建AffineTransform对象,然后调用setTransform()方法设置transform属性。最后,用具有指定属性的Graphics2D对象绘制图形。创建AffineTransform对象的方法有:

    getRotateinstrance(double theta):旋转theta弧度。

    getRotateInstance(double theta,dioble x,double y):绕旋转中心(x,y)旋转。

    getScaleInstance(double sx,double sy):x和y 方向分别按sx,sy比例变换。

    getTranslateInstance(double tx,double ty):平移变换。

    getShearInstance(double shx,double shy):斜切变换,shx和shy指定斜拉度。

    也可以先创建一个没有transform属性的AffineTransform对象,然后用以下方法指定图形平移、旋转、缩放变换属性。

    transelate(double dx,double dy):将图形在x轴方向平移dx像素。

    scale(double sx,double sy):图形在x轴方向缩放sx倍,纵向缩放sy倍。

    rotate(double arc,double x, double y):图形以点(x,y)为轴点,旋转arc弧度。

    例如,创建AffineTransform对象:

    AffineTransform trans = new AffineTransform();

    为AffineTransform对象指定绕点旋转变换属性:

    Trans.rotate(50.0*3.1415927/180.0,90,80);

    接着为Graphics2D 的对象g2d设置具有上述旋转变换功能的“画笔”:

    Graphics2D g2d = (Graphics2D)g;g2d.setTranstorm(trans);

    最后,以图形对象为参数调用具有变换功能的Graphics2D 对象的draw()方法。例如,设已有一个二次曲线对象curve,以下代码实现用上述旋转功能的g2d对象绘制这条二次曲线:

    g2d.draw(curve);

    4. clip属性

    clip属性用于实现剪裁效果。设置剪裁属性可调用setClip()方法确定剪裁区的Shape。连续多个setClip()得到它们交集的剪裁区。

    5. composit属性

    composit属性设置图形重叠区域的效果。先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite对象,再通过setComposite()方法设置混合效果。Alpha值的范围为0.0f(完全透明)-0.1f(完全不透明)。

    Graphics2D类的绘图方法

    Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。主要有:

    Line2D线段类,RoundRectangle2D圆角矩形类,Ellipse2D椭圆类,Arc2D圆弧类,QuadCurve2D二次曲线类,CubicCurve2D三次曲线类。

    要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态方法Double()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。例如以下代码用Graphics2D的新方法绘制线段和圆角矩形:

    Graphics2D g2d = (Graphics2D)g;//将对象g类型从Graphics转换成Graphics2D

    Line2D line = new Line2D.Double(30.0,30.0,340.0,30.0);

    g2d.draw(line);

    RoundRectangle2D rRect = new RoundRectangle2D.Double(13.0,30.0,100.0,70.0,40.0,20.0);

    g2d.draw(rRect);

    也可以先用java.awt.geom包提供的Shape对象,并用单精度Float坐标或双精度Double坐标创建Shape对象,然后再用draw()方法绘制。例如,以下代码先创建圆弧对象,然后绘制圆弧:

    Shape arc = new Arc2D.Float(30,30,150,150,40,100,Arc2D.OPEN);

    g2d.draw(arc)//绘制前面创建的图形对象arc

    Graphics2D的几何图形类

    线段

    Line2D line = new Line2D.Double(2,3,200,300);//声明并创建线段对象

    //起点是(2,3),终点是(200,300)

    矩形

    Rectangle2D rect = new Rectangle2D.Double(20,30,80,40);//声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40

    圆角矩形

    RoundRectangle2D rectRound = new RoundRectangle2D.Double(20,30,130,100,18,15);

    //左上角是(20,30),宽是130,高是100,圆角的长轴是18,短轴是15。

    椭圆

    Ellipse2D ellipse = new Ellipse2D.Double(20,30,100,50);

    //左上角 (20,30),宽是100,高是50

    圆弧

    Arc2D arc1 = new Arc2D.Double(8,30,85,60,5,90,Arc2D.OPEN);

    //外接矩形的左上角(10,30),宽85,高60,起始角是5度,终止角是90度

    Arc2D arc2 = new Arc2D.Double(20,65,90,70,0,180,Arc2D.CHORD);

    Arc2D arc3 = new Arc2D.Double(40,110,50,90,0,270,Arc2D.PIE);

    参数Arc2D.OPEN、Arc2D.CHORD、Arc2D.PIE分别表示圆弧是开弧、弓弧和饼弧。

    二次曲线

    二次曲线用二阶多项式表示:

    y(x)=ax2+bx+c

    一条二次曲线需要三个点确定:始点、控制点和终点。

    QuadCurve2D curve1 = new QuadCurver2D.Double(20,10,90,65,55,115);

    QuadCurve2D curve2 = new QuadCurver2D.Double(20,10,15,63,55,115);

    QuadCurve2D curve3 = new QuadCurver2D.Double(20,10,54,64,55,115);

    方法Double()中的6个参数分别是二次曲线的始点、控制点和终点。以上3条二次曲线的开始点和终点分别相同。

    三次曲线

    三次曲线用三阶多项式表示:

    y(x)=ax3+bx2+cx+d

    一条三次曲线需要四个点确定:始点、两个控制点和终点。

    CubicCurve2D curve1 = new CubicCurve2D.Double(12,30,50,75,15,15,115,93);

    CubicCurve2D curve2 = new CubicCurve2D.Double(12,30,15,70,20,25,35,94);

    CubicCurve2D curve3 = new CubicCurve2D.Double(12,30,50,75,20,95,95,95);

    方法Double()中的8个参数分别是三次曲线的始点、两个控制点和终点。

    一般的方程曲线的绘制过程用一个循环控制。通过循环产生自变量的值,按照方程计算出函数值,再作必要的坐标转换:原点定位的平移变换,图像缩小或放大的缩放变换,得到曲线的图像点,并绘制这个点。以绘制以下曲线方程为例:

    Y=sin(x)+cos(x),x

    绘制的部分代码可以写成如下:

    double x0,y0,x1,y1,x2,y2,scale;

    x0=100;y0=80;

    scale =20.0;

    for(x1=-3.1415926d;x1

    以上就是关于Java中Graphics2D类的使用操作解析了,想必都了解了吧,更多相关内容请继续关注爱站技术频道。

    更多相关内容
  • VectorGraphics2D VectorGraphics2D提供Java的Graphics2D接口的实现,并以各种矢量文件格式导出图形。 当前,支持以下矢量文件格式: 封装的PostScript:registered:(EPS) 可缩放矢量图形(SVG) 便携式文件...
  • 使用Java Graphics2D类生成心跳曲线坐标图,一般用于在服务器端生成坐标对数据图片,示例可以参考这里:https://blog.csdn.net/youxijishu/article/details/124545372?spm=1001.2014.3001.5502
  • 主要介绍了Java中的Graphics2D类基本使用教程,Graphics2D类较之Graphics类中的功能更加专业,需要的朋友可以参考下
  • 合成图片上用 java Graphics2d 写字 本地展示正常 linux 服务器乱码 解决方案-附件资源
  • Java中Graphics2D曲线实例.pdf 学习资料 复习资料 教学资源
  • Go的另一个2D图形包尽管图像功能与我将要制作的功能一样完整,但仍处于开发阶段。 顶级的“路径”和“形状”类型是完整的,并且已实现大多数PathProcessor,包括: StrokeProc-具有多种上限和联接类型的固定宽度的...
  • Java中Graphics2D直线实例.pdf 学习资料 复习资料 教学资源
  • Java中Graphics2D类的绘图属性.pdf 学习资料 复习资料 教学资源
  • Graphics 2D library-开源

    2021-07-09 06:17:50
    Graphics2D,TCustomConvexHull2D.cpp,TBaseIntersection2D.cpp,TCustomStraightLine2D.h,Vector2D.h,TCustomBaseLine2D.cpp,TCustomTriangle2D.h,TDBCustomPolygon2D.cpp,TDBCustomLine2D.cpp,TCustomCircle2D.h,...
  • java Graphics2D 画图

    2021-02-28 11:20:28
    public static BufferedImage coverImage(BufferedImage baseBufferedImage, BufferedImage coverBufferedImage, int x, int y, int width, int height) throws Exception{ // 创建Graphics2D对象,用在底图对象上...

    平时出图都是前端画图的,本次画图是对响应时间有要求,所有给后端提的需求。这里就给出一个demo 还有列出其中遇到的几个小问题

    1 首先列出结果图

    ba4694d4549e6a6780fe2d1cfe45d1c8.png

    2   遇到的问题

    1  这是两张图片覆盖的。

    coverImage 方法

    2  覆盖图是圆角矩形,但是四个角的底色要和底图保持一致

    需要先fillRect 填充相应的底色。

    3  覆盖图的文字显示问题, 因为是介绍,不确定字体的多少  自动换行  多行文字 自动计算高度  我这个是标题最多2行     介绍最多3行(在方法里面都是参数)。

    drawString  该方法从网上找的  自己改造了下

    4  font 字体的问题  和 Color颜色的问题

    font字体  从C:\Windows\Fonts 中找对应的字体就行   Font font3 = new Font("苹方-简", Font.BOLD, 28);    但是记得如果是奇葩字体 比如我这个要求苹果的字体  一定要把字体上传到linux服务器  否咋 测试或生成 文字就会变成 “口口”

    Color   颜色  java api 不能识别  #CC00FF   只能识别    Color.getHSBColor(153,153,153)

    5 推荐一个好使的颜色取色器

    链接:https://pan.baidu.com/s/1gxLTOIysfYQLlSWdMFmYpQ

    提取码:se9s

    3  main 代码

    public static void main(String[] args) throws Exception {

    int picWid=660;

    int picHeight1=269;

    int picHeight2=531;

    BufferedImage BufImage = new BufferedImage(picWid, picHeight1+picHeight2, BufferedImage.TYPE_INT_RGB);// RGB形式

    Graphics2D g = BufImage.createGraphics();

    g.drawRect(0,0,picWid,picHeight1);//画线框

    g.setColor(Color.red);

    g.fillRect(0,0,picWid,picHeight1);//是用预定的颜色填充一个矩形

    g.drawRect(0,picHeight1,picWid,picHeight2);//画线框

    g.setColor(Color.white);

    g.fillRect(0,picHeight1,picWid,picHeight2);//是用预定的颜色填充一个矩形

    // 设置圆形头像

    BufferedImage headImage = ImageIO.read(new       URL("https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKu4BoQkiauW80hPgpeLZSVkHXVDVY1iaQkicNj5UjY5w1DDqZqk6GnfedKPthqxdE4qK2K2wCUTMoUw/132"));

    headImage=convertCircular(headImage);

    // 获取小程序码

    BufferedImage qrCodeImage = ImageIO.read(new URL("https://sxhw-1251808348.cos.ap-beijing.myqcloud.com/xcxqrcode/2020-  04/af12e742bcf7662706f2c0153f0e82d8.jpg"));

    // 设置各组件位置

    //设置头像

    g.drawImage(headImage, 48, 32, 80, 80, null);

    //小程序码

    g.drawImage(qrCodeImage, 30, 620, 160, 160, null);

    //写字

    g.setColor(Color.white);

    Font font2 = new Font("苹方-简", Font.BOLD, 24);

    g.setFont(font2);

    g.drawString("丁一江", 148, 53);

    //写字

    g.setColor(Color.white);

    Font font3 = new Font("苹方-简", Font.BOLD, 28);

    g.setFont(font3);

    g.drawString("我的团购活动正在火热进行~", 148, 90);

    //写字

    g.setColor(Color.black);

    Font font4 = new Font("苹方-简", Font.BOLD, 32);

    g.setFont(font4);

    g.drawString("长按识别下程序码", 210, 677);

    //写字

    g.setColor(Color.getHSBColor(153,153,153));

    Font font5 = new Font("苹方-简", Font.BOLD, 24);

    g.setFont(font5);

    g.drawString("立即抢购好物", 210, 730);

    //覆盖层数据

    BufferedImage realImg = new BufferedImage(620, 456, BufferedImage.TYPE_INT_RGB);// RGB形式

    Graphics2D real2D = realImg.createGraphics();

    // real2D.drawRect(0,0,710,100);//画线框

    //解决 圆角矩形 4个角黑色 先填充颜色 在画矩形

    real2D.setColor(Color.red);

    real2D.fillRect(0,0,620,125);//是用预定的颜色填充一个矩形

    //real2D.drawRect(0,100,710,400);//画线框

    real2D.setColor(Color.white);

    real2D.fillRect(0,125,620,331);//是用预定的颜色填充一个矩形

    real2D.setColor(Color.white);

    real2D.fillRoundRect(0, 0, 620, 456,40, 40);

    //商品介绍

    String groupName="商品标题test-商品标题test-商品标题test-商品标题test-商品标题test-商品标题test-商品标题test-商品标题test-商品标题test";

    String groupDetail="商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test-商品详情test";

    String price="商品团购价:¥5-¥28.8";

    //写字

    real2D.setColor(Color.black);

    Font font6 = new Font("苹方-简", Font.BOLD, 28);

    int height=drawString(real2D,font6,groupName,578,20,40,30,2);

    //写字

    real2D.setColor(Color.gray);

    Font font7 = new Font("苹方-简", Font.BOLD, 20);

    height=drawString(real2D,font7,groupDetail,578,20,height+20,30,3);

    //写字

    real2D.setColor(Color.red);

    Font font8 = new Font("苹方-简", Font.BOLD, 28);

    height=drawString(real2D,font8,price,578,20,height+40,30,1);

    // 商品图片

    List imgList=new ArrayList();

    imgList.add("https://sxhw-1251808348.cos.ap-beijing.myqcloud.com/prod-image/2020-04/22824b828c39aec9396fe345cc2d8cb0.jpg");

    imgList.add("https://sxhw-1251808348.cos.ap-beijing.myqcloud.com/prod-image/2020-04/3c4dbfef1fbe4c8ae092e0efc79ecb8c.jpg");

    imgList.add("https://sxhw-1251808348.cos.ap-beijing.myqcloud.com/prod-image/2020-04/0a5774763ea977d5421b08b8204a0ed7.jpg");

      for(int i=0;i

    String imgUrl=imgList.get(i);

    BufferedImage posterBufImage = ImageIO.read(new URL(imgUrl));

    real2D.drawImage(posterBufImage, 180*i+(i+1)*20, height, 180, 179, null);

    }

    // 两张图片覆盖

    BufImage = coverImage(BufImage, realImg, 20, 144, 620, 456);

    // g.setColor(Color.blue);

    ImageIO.write(BufImage, "png", new File("D:\\1111test\\demo31.png"));

    }

    /**

    * 文字超出限定长度自动换行

    *

    * @param g 画布

    * @param font 字体样式

    * @param text 文字

    * @param widthLength 最大长度 (多少长度后需要换行)

    * @param x 文字位置坐标 x

    * @param y 文字位置坐标 Y

    * @param yn 每次换行偏移多少pt

    * showLine 显示行数 文字可能过多 我们只显示showLine行文字

    */

    private static int drawString(Graphics2D g, Font font, String text1, int widthLength, int x, int y, int yn,int showLine) {

    FontMetrics fg = g.getFontMetrics(font);

    List ls = new ArrayList<>();

    getListText(fg, text1, widthLength, ls);

    g.setFont(font);

    for (int i = 0; i < ls.size(); i++) {

    if(i==showLine) {

    break;

    }

    if (i == 0) {

    g.drawString(ls.get(i), x, y);

    } else {

    g.drawString(ls.get(i), x, y + i*yn);

    }

    }

    int height=fg.getHeight();

    if(ls.size()<=showLine) {

    y=y+height*ls.size();

    }else {

    y=y+height*showLine;

    }

    return y;

    }

    /**

    * 递归 切割字符串

    * @param fg

    * @param text

    * @param widthLength

    * @param ls

    */

    private static void getListText(FontMetrics fg, String text, int widthLength, List ls) {

    String ba = text;

    boolean b = true;

    int i = 1;

    while (b) {

    if (fg.stringWidth(text) > widthLength) {

    text = text.substring(0, text.length() - 1);

    i++;

    } else {

    b = false;

    }

    }

    if (i != 1) {

    ls.add(ba.substring(0, ba.length() - i));

    getListText(fg, ba.substring(ba.length() - i), widthLength, ls);

    } else {

    ls.add(text);

    }

    }

    //覆盖图片方法

    public static BufferedImage coverImage(BufferedImage baseBufferedImage, BufferedImage coverBufferedImage, int x, int y, int width, int height) throws Exception{

    // 创建Graphics2D对象,用在底图对象上绘图

    Graphics2D g2d = baseBufferedImage.createGraphics();

    // 绘制

    g2d.drawImage(coverBufferedImage, x, y, width, height, null);

    g2d.dispose();// 释放图形上下文使用的系统资源

    return baseBufferedImage;

    }

    /**

    * 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的

    *

    * @param url

    * 用户头像地址

    * @return

    * @throws IOException

    */

    public static BufferedImage convertCircular(BufferedImage bi1) throws IOException {

    //BufferedImage bi1 = ImageIO.read(new File(url));

    // 这种是黑色底的

    //BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_INT_RGB);

    // 透明底的图片

    BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);

    Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1.getHeight());

    Graphics2D g2 = bi2.createGraphics();

    g2.setClip(shape);

    // 使用 setRenderingHint 设置抗锯齿

    g2.drawImage(bi1, 0, 0, null);

    // 设置颜色

    g2.setBackground(Color.green);

    g2.dispose();

    return bi2;

    }

    展开全文
  • 按照工具类要求把模块的要求参数传入和封装,把线条的参数要求和封装可以很成功的生成流程图样子
  • 正如我们在前面提到的,我们可以对Graphics2D类进行多项设置。实际上,渲染引擎在绘制Graphics2D图形前会查看7个主要的属性:PaintStrokeFontTransformationClipping spaceRendering hintsCompositing rule让我们...

    正如我们在前面提到的,我们可以对Graphics2D类进行多项设置。实际上,渲染引擎在绘制Graphics2D图形前会查看

    7个主要的属性:

    Paint

    Stroke

    Font

    Transformation

    Clipping space

    Rendering hints

    Compositing rule

    让我们逐一讲解:

    Paint

    新的paint可以同时作用在边线和填充上了。Graphics2D类可以用

    setPaint()和getPaint()方法配制paint属性:

    g2.setPaint(java.awt.Paint

    paint);      Paint paint =

    g2.getPaint();paint可以是单色,渐变和图案。任何paint都需要实现java.awt.Paint接口。

    Java 2D类库中有三个类你应该感到熟悉:

    java.awt.Color:

    Java

    2D使用同样的常量。因为Color类实现了java.awt.Paint接口,所有的Color对象都是Paint对象。

    java.awt.GradientPaint:

    这个类用颜色渐变填充一个区域。构造函数制定比例和颜色。图形引擎会从第一个点到第二个点之

    间线性变化两个颜色。我们还可以指定颜色图案是否允许重复。

    java.awt.TexturePaint:

    这个类平铺一个图像来填充图形。构造函数接收一个

    java.awt.image.BufferedImage和一个Rectangle2D,把图像影射到矩形里,然后平铺矩形。

    图3

    显示java.awt.GradientPaint和java.awt.TexturePaint的实例。

    Figure-3.gif

    图 3. GradientPaint 和 TexturePaint

    建立一个BufferedImage来保存图像相对是更直接的方法。在

    BufferedImage的构造函数里制定长,宽,高,类型为BufferedImage.TYPE_INT_RGB,然后调用

    createGraphics()方法得到一个Graphics2D。

    如果要用图片的话就需要更多的步骤。首先,从一个图片文件里读入Image对象,用

    MediaTracker保证图片完全读入,然后建立和Image对象等宽高的空BufferedImage对象。通过createGraphics()

    方法得到Graphics2D对象,最后把Image对象加载到bufferedImage里。

    Stroke

    描边决定着图形或文字的轮廓。通过setStroke()方法定义描边::

    g2.setStroke(java.awt.Stroke

    stroke);      java.awt.Stroke stroke = g2.getStroke();在Java

    2D出现以前,java.awt.Graphics的描绘方法产生一个1像素宽的实线边。Java 2D

    API给你更灵活的描边选择。边缘即可以是粗细不等的实线,也可以是等宽点线。

    setStroke()方法的参数必须实现java.awt.Stroke接口。现在

    java.awt.BasicStroke类是唯一实现的类。下面是BasicStroke的构造函数:

    BasicStroke():

    这个构造建立一个1单位宽的描边。端点样式是默认的CAP_SQUARE,默认接头样式是默

    认的 JOIN_MITER。

    BasicStroke(float penWidth):

    指定线宽,端点样式使用默认的CAP_SQUARE,默认接头样式使用默认的

    JOIN_MITER。

    BasicStroke(float penWidth, int capStyle,

    int joinStyle):

    指定线宽,端点样式和接头样式。

    BasicStroke(float penWidth, int capStyle,

    int joinStyle, float miterLimit):

    基本同上,但可以设置拼接连接的延长度,默认是10。

    BasicStroke(float penWidth, int capStyle,

    int joinStyle, float miterLimit,

    float[] dashPattern, float dashOffset):

    这个构造可以通过一个表明[透明,不透明的]数组,建立点线轮廓。offset是点线的起始

    位置,一般是0,0。

    正如这5个构造函数所示,BasicStroke类允许设定端点样式。型如下:

    java.awt.BasicStroke.CAP_BUTT: 端点直接切断。

    java.awt.BasicStroke.CAP_ROUND:

    以线宽为直径的圆形端点。

    java.awt.BasicStroke.CAP_SQUARE:

    半线宽单位延伸的方块端点。

    BasicStroke 还可以指定端点的连接样式,斜角,拼接和圆角:

    java.awt.BasicStroke.JOIN_BEVEL:

    用直线连接两条线的外角。

    java.awt.BasicStroke.JOIN_MITER:

    延伸外角直至两线相接。

    java.awt.BasicStroke.JOIN_ROUND:

    半线宽单位的圆形封顶。

    图 4 是以上各个选项的效果。

    Figure-4.gif

    图 4. BasicStroke 的 Cap 和 Join 选项。

    下面的例子用BasicStroke生成点线:

    Stroke stroke = new BasicStroke(5.0f

    ,                   // 线宽

    BasicStroke.CAP_ROUND,   // 端点

    BasicStroke.JOIN_MITER, // 接头

    15.0f,                   // 拼接限制                                 new

    float[] {10.0,10.0} // 点线图案

    5.0);                    // 定位 我们再看一下最后三个属性:

    拼接限制可以避免当两条线以JOIN_MITER连接且角度很小的时候,延伸的很夸张。点线

    图案是一个浮点数组,第一个是实线的长度,第二个是间断的长度。不断重复描绘实线和间断实现点线效果。最后的定位设置了位移,即线的起始点。

    Font

    所有的文本都使用能表现文字的样式图形渲染。当前的字体决定了字体的形状。使用继承自

    java.awt.Graphics的getFont()方法和setFont()方法来操纵字体。尽管设置字体相对简单的工作,Java

    2D还是为文本描绘提供了丰富的选线。本文的后续版本会深度讨论这个问题。

    Transformation

    图形在渲染前可能会进行一步或多步的变形。简单而言就是图形可能被移动,旋转或拉伸。可以通

    过setTransform()方法设置当前的变形:

    g2.setTransform(java.awt.geom.AffineTransform transform);

    AffineTransform transform =

    g2.getTransform();Graphics2D类提供许多方便的方法帮助实现变形。

    public void rotate(double theta);

    public void rotate(double theta, double aroundPointX, double

    aroundPointY);     public void scale(double scaleX, double scaleY);

    public void shear(double shearX, double shearY);     public void

    translate(double translateX, double translateY);     public void

    transform(AffineTransform

    transform);同样,你也可以直接操纵数字矩阵来实现复杂变形。这要比使用基本的变换,旋转,缩放,倾斜变形等复杂的多。更多关于线性代数的知识

    超出了本文的讨论范围,在Java 2D API里会对此有说明。一旦你熟悉了这些概念,它们可以有效地帮你实现变形。

    java.awt.AffineTransform类提供了大量的变形控制,可以唯一可实现

    和上文提到的矩阵能实现的复杂变形的类。通过AffineTransform类的静态方法可以得到一个AffineTransform对象,如

    AffineTransform.getRotateInstance(....),或

    AffineTransform.getShearInstance(...),或者不带参的构造函数创建单位变形。

    AffineTransform newTransformation = new

    AffineTransform();单位变形包含一个单位矩阵,该矩阵保留原始矢量且不可被操作变形。可以用下面的方法修改变形行为:

    public void rotate(double theta);

    public void rotate(double theta, double aroundPointX, double

    aroundPointY);     public void scale(double scaleX, double scaleY);

    public void shear(double shearX, double shearY);     public void

    translate(double translateX, double

    translateY);此外,用下面的方法可以重值单位变形。setToIdentity()方法是个例外,它执行了一个简单变形。

    public void setToIdentity();

    public void setToRotation(double theta);     public void

    setToRotation(double theta, double aroundPointX, double

    aroundPointY);     public void setToScale(double scaleX, double

    scaleY);     public void setToShear(double shearX, double shearY);

    public void setToTranslation(double translateX, double

    translateY);你还可以连接或预连接其他AffineTransform类。这样不仅仅是精确控制变形顺序,而是创建了变形序列(例如变换

    ->旋转->变换->缩放...)。使用下面的方法连接或预连接:

    public void

    concatenate(AffineTransform transform);     public void

    preConcatenate(AffineTransform transform);

    Clipping Space

    如果渲染操作在当前的剪辑空间外,则任何像素不会被改变。当前默认的剪辑空间是null,即

    修改整个图像表层。可以用setClip()方法设置当前的剪辑空间,该方法继承自java.awt.Graphics:

    g2.setClip(Shape clip);

    g2.setClip(int x, int y, int width, int height);     Shape clip =

    g2.getClip();此外,Graphics2D类提供了chip()方法,可以把传入的图形和当前剪辑空间的交集设置为新的剪辑空间。

    g2.clip(Shape

    s);图形既可能是矩形之类的简单图形,也可能是字母数字之类的复杂图形。通过剪辑,可以选择或排出会受影响的像素。

    Rendering Hints

    Rendering

    hints是Graphics2D对象描绘基本类型时使用的各种描绘方法。如先前使用的抗锯齿hint。这些hints被封装在

    java.awt.RenderingHints类中。由于使用Java 2D

    API会比旧的AWT涉及更多的计算,设计师默认禁止了一部分特性以提高性能。两个最常用的设置是抗锯齿(混合锯齿柔滑锯齿线)和高质量渲染,如下:

    RenderingHints renderHints =

    new

    RenderingHints(RenderingHints.KEY_ANTIALIASING,

    RenderingHints.VALUE_ANTIALIAS_ON);

    renderHints.put(RenderingHints.KEY_RENDERING,

    RenderingHints.VALUE_RENDER_QUALITY);      ...      public void

    paintComponent(Graphics g) {        super.paintComponent(g);

    Graphics2D g2d = (Graphics2D)g;

    g2d.setRenderingHints(renderHints);        ...      }

    其他渲染hints适用在不同的环境下。如缩放图片时,为KEY_INTERPOLATION使用

    VALUE_INTERPOLATION_BILINEAR。请查阅本类的Javadoc,详细了解各个选项所适用的环境。

    Compositing Rule

    组合规则决定图形之间颜色的相互影响。例如图片或图形的不透明度属于整个分类。以下方法可以

    得到组合规则:

    g2.setComposite(java.awt.Composite

    composite);     Composite composite = g2.getComposite();Java

    2D允许分配透明(alpha)值,以便底层的图形可以显示出来。通常我们会创建一个java.awt.AlphaComposite对象,然后传入

    setComposite()方法的实现。

    通常,用AlphaComposite.getInstance()方法,配合一定的混合规

    则和透明度值,创建AlphaComposite对象。Java 2D内建了一些符合 Porter-Duff

    组合规则的混合规则。但在处理不透明时,通常会使用AlphaComposite.SRC_OVER。透明值由透明到不透明是在0.0和1.0之间。下面

    是完整的列表:

    AlphaComposite.CLEAR   -

    交集部分的颜色和透明被清除。     AlphaComposite.DST   - 目标未修改。

    AlphaComposite.DST_ATOP   - 目标和源重叠的部分组合在源上。     AlphaComposite.DST_IN   -

    显示目标和源重叠的部分。     AlphaComposite.DST_OUT   -显示目标没有和源重叠的部分。

    AlphaComposite.DST_OVER   - 目标覆盖在源之上。     AlphaComposite.SRC   -

    源复制给目标。     AlphaComposite.SRC_ATOP   - 源和目标重叠的部分组合在目标上。

    AlphaComposite.SRC_IN   - 显示源和目标重叠的部分。     AlphaComposite.SRC_OUT   -

    显示源没有和目标重叠的部分。     AlphaComposite.SRC_OVER   - 源覆盖在目标之上。图 5

    是几个常用选项的图形效果。

    Figure-5.gif

    图 5. Alpha Composite的常用选项。

    展开全文
  • Java | 绘图:Graphics2D

    千次阅读 2021-11-01 14:53:08
    在 Swing 组件的实际绘制中通常使用的是 Graphics 的一个子类 Graphics2D, 该类中提供了更为丰富的接口来绘制更为复杂的需求。 Graphics2D类中的部分方法: 1、参数 / 设置 // 设置背景(擦除后显示该背景) ...

    在 Swing 组件的实际绘制中通常使用的是 Graphics 的一个子类 Graphics2D, 该类中提供了更为丰富的接口来绘制更为复杂的需求。

    Graphics2D类中的部分方法:

    1、参数 / 设置

    // 设置背景(擦除后显示该背景)
    void setBackground(Color color)
    // 设置笔画的轮廓特性(如画笔宽度、实线、虚线等)
    void setStroke(Stroke s)

    2、绘制结果的变换

    // 平移
    void translate(int x, int y)
    // 旋转
    void rotate(double theta, double originX, double originY)
    // 缩放
    void scale(double sx, double sy)

    // 将图片经过指定变换后绘制显示
    boolean drawImage(Image image, AffineTransform xform, ImageObserver obs)

    3. 自定义组件, 绘图演示(直线曲线、矩形、椭圆等等)

    import javax.swing.*;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            /*
             * 在 AWT 的事件队列线程中创建窗口和组件, 确保线程安全,
             * 即 组件创建、绘制、事件响应 需要处于同一线程。
             */
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // 创建窗口对象
                    MyFrame frame = new MyFrame();
                    // 显示窗口
                    frame.setVisible(true);
                }
            });
        }
    
        /**
         * 窗口
         */
        public static class MyFrame extends JFrame {
    
            public static final String TITLE = "Java图形绘制";
    
            public static final int WIDTH = 250;
            public static final int HEIGHT = 300;
    
            public MyFrame() {
                super();
                initFrame();
            }
    
            private void initFrame() {
                // 设置 窗口标题 和 窗口大小
                setTitle(TITLE);
                setSize(WIDTH, HEIGHT);
    
                // 设置窗口关闭按钮的默认操作(点击关闭时退出进程)
                setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
                // 把窗口位置设置到屏幕的中心
                setLocationRelativeTo(null);
    
                // 设置窗口的内容面板
                MyPanel panel = new MyPanel(this);
                setContentPane(panel);
            }
    
        }
    
        /**
         * 内容面板
         */
        public static class MyPanel extends JPanel {
    
            private MyFrame frame;
    
            public MyPanel(MyFrame frame) {
                super();
                this.frame = frame;
            }
    
            /**
             * 绘制面板的内容: 创建 JPanel 后会调用一次该方法绘制内容,
             * 之后如果数据改变需要重新绘制, 可调用 updateUI() 方法触发
             * 系统再次调用该方法绘制更新 JPanel 的内容。
             */
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                // 重新调用 Graphics 的绘制方法绘制时将自动擦除旧的内容
    
                /* 自行打开下面注释查看各绘制效果 */
    
                // 1. 线段 / 折线
                drawLine(g);
    
                // 2. 矩形 / 多边形
                // drawRect(g);
    
                // 3. 圆弧 / 扇形
                // drawArc(g);
    
                // 4. 椭圆
                // drawOval(g);
    
                // 5. 图片
                // drawImage(g);
    
                // 6. 文本
                // drawString(g);
            }
    
            /**
             * 1. 线段 / 折线
             */
            private void drawLine(Graphics g) {
                frame.setTitle("1. 线段 / 折线");
    
                // 创建 Graphics 的副本, 需要改变 Graphics 的参数,
                // 这里必须使用副本, 避免影响到 Graphics 原有的设置
                Graphics2D g2d = (Graphics2D) g.create();
    
                // 抗锯齿
                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();
            }
    
            /**
             * 2. 矩形 / 多边形
             */
            private void drawRect(Graphics g) {
                frame.setTitle("2. 矩形 / 多边形");
                Graphics2D g2d = (Graphics2D) g.create();
    
                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);
    
                g2d.dispose();
            }
    
            /**
             * 3. 圆弧 / 扇形
             */
            private void drawArc(Graphics g) {
                frame.setTitle("3. 圆弧 / 扇形");
                Graphics2D g2d = (Graphics2D) g.create();
    
                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();
            }
    
            /**
             * 4. 椭圆 (实际上通过绘制360度的圆弧/扇形也能达到绘制圆/椭圆的效果)
             */
            private void drawOval(Graphics g) {
                frame.setTitle("4. 椭圆");
                Graphics2D g2d = (Graphics2D) g.create();
    
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setColor(Color.RED);
    
                // 1. 绘制一个圆: 圆的外切矩形 左上角坐标为(0, 0), 宽高为100
                g2d.drawOval(0, 0, 100, 100);
    
                g2d.setColor(Color.GRAY);
    
                // 2. 填充一个椭圆
                g2d.fillOval(120, 100, 100, 150);
    
                g2d.dispose();
            }
    
            /**
             * 5. 图片
             */
            private void drawImage(Graphics g) {
                frame.setTitle("5. 图片");
                Graphics2D g2d = (Graphics2D) g.create();
    
                // 从本地读取一张图片
                String filepath = "demo.jpg";
                Image image = Toolkit.getDefaultToolkit().getImage(filepath);
    
                // 绘制图片(如果宽高传的不是图片原本的宽高, 则图片将会适当缩放绘制)
                g2d.drawImage(image, 50, 50, image.getWidth(this), image.getHeight(this), this);
    
                g2d.dispose();
            }
    
            /**
             * 6. 文本
             */
            private void drawString(Graphics g) {
                frame.setTitle("6. 文本");
                Graphics2D g2d = (Graphics2D) g.create();
    
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
                // 设置字体样式, null 表示使用默认字体, Font.PLAIN 为普通样式, 大小为 25px
                g2d.setFont(new Font(null, Font.PLAIN, 25));
    
                // 绘制文本, 其中坐标参数指的是文本绘制后的 左下角 的位置
                // 首次绘制需要初始化字体, 可能需要较耗时
                g2d.drawString("Hello World!", 20, 60);
                g2d.drawString("你好, 世界!", 20, 120);
    
                g2d.dispose();
            }
    
        }
    
    }

    展开全文
  • Java 使用Graphics2D 进行画图

    千次阅读 2021-03-08 09:10:55
    Graphics2D g2d = (Graphics2D) image.getGraphics(); g2d.setStroke(new BasicStroke(5));//BasicStroke(线条粗细) g2d.setColor(Color.red); //drawLine(int x1,int y1,int x2,int y2) g2d.drawLine(100, 100, ...
  • Graphics2D画图案例

    2021-09-05 22:16:02
    为此,作为Java后端的我,花了2天时间学习了下Java的Graphics2D的基本的绘制技巧,基本能实现既定的目标。后面的绘制后面再说,这里先把网上搜到的好的案例记录下: 绘制线 2个点连起来: import j
  • Java Graphics2D的使用

    千次阅读 2021-03-03 14:58:18
    Java Graphics2D的使用 文章目录Java Graphics2D的使用前言一、Graphics2D基础方法使用二、绘制不规则多边形三、填充(图片)不规则多边形四、翻转图像(上下、左右180°)五、绘制文字,简单封装(其实就是...
  • Graphics2D类基本使用

    千次阅读 多人点赞 2021-01-28 13:06:35
    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。 一、绘图属性 Graphics2D...
  • 现在都讲究立体的效果,Graphics2D类的绘图方式就属于高级绘图了,在我们日常生活中经常提到的2d、3d电影都是立体的,而编程语言也是一样,可以实现2d的效果哦,下面就让我们一起来学习下吧!Java语言在Graphics类...
  • abstract Composite getComposite() 返回 Graphics2D 上下文中的当前 Composite abstract GraphicsConfiguration getDeviceConfiguration() 返回与此 Graphics2D 关联的设备配置。 abstract FontRenderContext ...
  • Graphics2D画图

    2022-04-23 22:57:18
    // TODO: handle exception } } public int getWatermarkLength(String waterMarkContent, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, ...
  • Graphics2D继承自Graphics,它扩展了Graphics的绘图功能,拥有更强大的二维图形处理能力,提供对几何形状、坐标转换、颜色管理以及文字布局等更精确的控制。Graphics2D定义了几种方法,用于添加或改变图形的状态属性...
  • **一、笔者在开发过程中遇到生成分享海报的需求,需要后端动态生成分享图(最终前端自己实现的,哈哈)...首先获取Graphics2D实例 ```java BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedI
  • java.awt类 Graphics2Djava.lang.Object继承者 java.awt.Graphics继承者 java.awt.Graphics2Dpublic abstract class Graphics2Dextends Graphics此Graphics2D类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色...
  • 可以从一个Graphics2D绘制到另一个Graphics2D吗?让我解释.我有打印问题,当我在屏幕上显示JTextArea或JTextPanel时,内部使用sun.java2d.SunGraphics2D,但是当我打印其使用的sun.print.PeekGraphics和sun.awt.windows...
  • 使用Graphics2D生成图片

    2022-07-06 21:24:20
    使用Graphics2D生成图片
  • Graphics2D 中文乱码

    2021-02-26 10:19:36
    今天遇到了一个乱码问题,合成的小票图片上的中文全部变成了口口口,后来在网上查了资料,发现是Graphics2D用了宋体字,而linux服务器上没有对应的字体库。把本地的字体库上传上去就解决了。本地字体库位置:(winXP ...
  • I'm busy fiddling around with Java's Graphics2D and drawings and I although it works I am not sure how to create a BufferedImage from this graphic which it seems I need to do in order so save it somew...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,921
精华内容 27,568
关键字:

graphics2d