导出excel带水印:前置知识2 Graphics2D用法

参照资料JAVA中BufferedImage、ImageIO、Graphics2D用法
10.3在组件中显示信息

Graphics2D一些方法(因为水印才看其中几个需要的,画图形那几个方法根本不看)

1、在窗口画一条直线:drawLine(int x1,int y1,int x2,int y2)

 g.drawLine(3,3,50,50);//在(3,3)与(50,50)之间画一条线段
 g.drawLine(100,100,100,100);//画一个点

2、画折线: drawPolyline(int[],int[],int),各点的x、y坐标,折线数。
3、画字符串:drawString(String str,int x,int y),x、y是开始显示的位置(项目用到)
若要精确定位,则需要知道字符串显示的长度和字高,可以通过FontMetrics类来实现

FontMetrics fm = g.getFontMetrics(font); //从Graphics对象获取FontMetrics对象
  int height = fm.getHeight(); //调用其getHeight()获得字高
  int width = fm.stringWidth(s1); //获得字符串宽度

应用 FontMetrics 精确定位,获取文本的宽高等。

String s1 = "Hello, Java World!";
  g.setColor(Color.red);
  setBackground(new Color(0,255,0));
  Font font = new Font("Arial", Font.BOLD, 18);
  g.setFont(font);
  FontMetrics fm = g.getFontMetrics(font);
  int height = fm.getHeight();
  int width = fm.stringWidth(s1);
  int posx =50; int posy = 50;
  g.drawString(s1 ,posx, posy);
  g.drawString("I will come in." ,posx +width, posy+height);

4.消除字体锯齿

// 消除边缘抗锯齿
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            // 文本抗锯齿
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

5.setPaint(getPaint)方法可以为图形上下文上的所有后续的绘制操作选择颜色

g.setPaint(Color.RED);
g.drawString("wj",100,100);

可以用一种颜色填充一个封闭图形(例如:矩形,椭圆)的内部,为此只需要调用draw替换为fill

Rectangle2D rect=...;
g2.setPaint(Color.RED);
g2.fill(rect);

!!要想用多种颜色绘制,就需要选择一个颜色,绘制图形,再选择另外一种颜色,再绘制图形
Color定义的两种方法
方式一:Color类用于定义颜色在java.awt.Color类中定义了13个预定义的常量,它们分别表示13种标准颜色。

BLACK,BLUE,CYAN,DARK_GRAY,GRAY,GREEN,LIGHT_GRAY,
MAGENTA,ORANGE,PINK,RED,WHITE,YELLOW

方式二:可以提供三色分量来创建Color对象,从而指定一个定制颜色,红,绿,和蓝三种颜色,取值为0~255之间的整数:(项目用到new java.awt.Color创建Color)

g2.setPaint(new Color(0,128,128));
g2.drawString("Welcome!",75,125);

6.设置前景色:Color getForeground / setForeground
7.设置背景色:Color getBackground / setBackground
8.设置画笔字体:setFont(Font font);(项目用到,重点看)
要想知道特定计算机上的可用的字体,可以调用GraphicsEnvironment类的getAvailableFontFamilyName方法,这个方法将返回以一个字符串数组其中包含了所有可用的字体名,GraphicsEnvironment类描述了用户系统的图形上下文,为了的到这儿类的对象需要调用静态的 getLocal GraphicsEnvironment方法。下面这个程序会打印所有的字体名:

import java.awt.*;
public class ListFonts
{
public static void main(String[] args)
{
String[] fontNames=GraphicsEnviroment.getLocalGrapgicsEnvironment().getAvailableFontFamilyName();
for(String FontName:fontNames)
{
System.out,println(FontName);
}
}
}

AWT定义了5个逻辑字体名
SansSerif
Serif
Monospaced
Dialog
DialogInput

要想使用某种字体绘制字符,必须首先创建一个Font类的对象,需要指定字体名,字体风格和字体大小,下面是构造一个Font对象的例子

var sansbold14=new Font("SansSerif",Font.BOLD,14);

第三个参数是字体大小
第二个参数是字体的风格(常规,加粗,斜体或者粗斜体);
Font.PLAIN
Font.BOLD
Font.ITALIC
Font.BOLD+Font.ITALIC

要将字符串居中,而不是任意位置,需要知道字符串占据的宽和高的像素数,这两个值取决于下面的三个因素:(项目使用)
1.使用的字体(在这个例子中为sans serif,加粗,14点)
2.字符串(在这个例子中为”hello world“)
3.绘制字体的设备(在这个例子中为用户屏幕)
要想得到表示屏幕设备字体属性的对象,需要调用Graphics2D类中的getFontRenderContext方法,它将返回一个FontRenderContext类的对象。可以将这个对象传递给Font类的getStringBounds 方法:

FontRenderContext context=g2.getFontRenderContext();
Reectangle2D bounds=sansbold14.getStringBounds(message,context);

getStringBounds方法返回包围字符串的矩形

术语 基线(baseline)是一条虚构的线,例如,字母”e“所在的底线。上坡度(ascent)是从基线到坡顶(ascent)的距离(坡顶是”b“”k“或大写字母的上面部分)。下坡度(descent)是从基线到坡底(descenter)的距离(坡底是”p“或”g“等字母的下面部分)
在这里插入图片描述
行间距是某一行的坡底与其下一行的坡顶之间的空隙(这个术语源于打字机分隔行的间隔带)。字体的高度是连续两个基线之间的距离,它等于下坡度+行间距+上坡度。
getStringBounds 方法返回的矩形宽度是字符串水平方向的宽度。矩形的高度是上坡度,下坡度和行间距的综合。

这个矩形始于字符串的基线,矩形顶部的y坐标为负值,因此可以使用下面的方法获得字符串的宽度,高度和上坡度:

double stringWidth=bounds.getWidth();
double stringHeight=bounds,getHeight();
double ascent=-bounds.getY();

如果需要知道下坡度和行间距,可以使用Font类的getLineMetrics方法。
这个方法将返回一个LineMetrics类的对象,获得下坡和行间距的方法是:

LineMetrics metrics=f.getLineMetrics(message,context);
float descent=metrics.getDescent();
float leading=metrics.getLeading();

9.画各种图形

画矩形:drawRect(int x,int y,int width,int height),画矩形线框,x,y指定了左上角位置,后两个为矩形宽高;fillRect(iny x.int y,int width,int height),指定填充颜色。

g.drawRect(80,100,40,25);//画线框
g.setColor(Color.yellow);
g.fillRect(20,70,20,30);//画着色块

画圆角矩形:drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight),线框,最后两个宽高是圆角弧的横向直径和纵向直径;fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight),颜色填充。

g.drawRoundRect(10,10,150,70,40,25);//画一个圆角矩形
g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块
g.drawRoundRect(10,150,40,40,40,40);//画圆
g.setColor(Color.red); g.fillRoundRect(80,100,100,100,100,100);//画圆块

画三维矩形: draw3DRect(int x,int y,int width,int height,boolean raised),画一个突出显示的矩形(即3D矩形),raise是突出与否;fill3DRect(int x,int y,int width,int height,boolean raised),颜色填充。

g.draw3DRect(80,100,40,25,true);//画一个线框
g.setColor(Color.yellow); g.fill3DRect(20,70,20,30,true);//画一个着色块

画椭圆:drawOval(int x,int y,int width,int height), x、y是中心坐标,长轴、短轴;fillOval(int x,int y,int width,int height),填充。

画圆弧:drawArc(int x,int y,int width,int height,int startAngle,int arcAngle),画椭圆一部分的圆弧线,椭圆中心时它的外接矩形的中心,外接矩形左上角坐标为(x,y),宽width,高height,startAngle单位是度,其实角度0度是指3点钟方向,startAngle和arcAngle表示从startAngle角度开始,逆时针方向画arcAngle度的弧,约定,正值度数是逆时针方向,负数为顺时针,例如-90°是6点钟方向;fillArc(int x,int y,int width, int height, int startAngle, int arcAngle),着色。

g.drawArc(10,40,90,50,0,180);//画圆弧线
g.drawArc(100,40,90,50,180,180);//画圆弧线
g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270);//填充缺右上角的四分之三的椭圆
g.setColor(Color.green); g.fillArc(60,110,110,60,-90,-270);//填充缺左下角的四分之三的椭圆

画多边形:drawPolygon(int xPoints[],int yPoints[],int nPoints),多边形是多条线段首尾连接而成的封笔平面图,多边形线段端点的x,y坐标存储在两个数组中,画多边形就是按给定的坐标点顺序用直线段将它们连起来,nPoints是坐标点个数;fillPolygon(int xPoints[],int yPoints[],int nPoints),着色。

int px1[]={50,90,10,50};//首末点相重,才能画多边形
int py1[]={10,50,50,10};
int px2[]={140,180,170,180,140,100,110,140};
int py2[]={5,25,35,45,65,35,25,5};
g.setColor(Color.blue);
g.fillPolygon(px1,py1,4);
g.setColor(Color.red);
g.drawPolygon(px2,py2,9);

画图片:drawImage(Image image,int x,int y)
在图片上画图片时(水印),设置与原图组合方式(项目用到)

// 原图和水印图的组合方式,alpha:透明度0-->1
 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

组合方式:

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 - 源覆盖在目标之上

10.限定作图显示区域:clipRect(int x,int y,int width,int height),用一个矩形表示图形的显示区域,超出部分不显示,多个限制区有覆盖时,得到交集区域

g.clipRect(0,0,100,50);g.clipRect(50,25,100,50);

11。复制图形:copyArea(int x,int y,int width,int height,int dx,int dy),dx和dy表示将图形复制到原位置偏移的像素点数,正值为往右或往下偏移,负值为往左或往上偏移,x、y是要复制矩形区域的左上角坐标。以下代码将一个矩形的部分、另一个矩形的全部分别平移

g.drawRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,70,-20,80);
g.copyArea(110,50,60,60,10,80);

12.对Point、Rectangle类的应用

Point p = new Point(cx / 2, cy / 2); //定义一个点
Rectangle rect = new Rectangle((p.x - 40), (p.y - 40), 80, 40); //定义一个矩形
int[] xP = {(p.x - 40), (p.x + 90), p.x+200, (p.x - 40)};
int[] yP = {(p.y - 40), (p.y +140), (p.y + 60), (p.y-40)};
g.drawArc(rect.x, rect.y, rect.width, rect.height * 2, 270, 90); //画弧
g.drawPolygon(xP, yP,3); //画多边形
g.setColor(Color.red);
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值