FontMetrics
谈谈Graphics类
谈谈java.awt.Graphics类图形环境的概念同在GUI 平台上开发应用程序紧密相关。
虽然通常将窗口和组件本身作为对象来表达,但仍然需要另一个接口来执行实际的绘制、着色以及文本输出操作。
Java 语言中提供这些功能的基类称作java.awt.Graphics。
从ponent 类(所有窗口对象的基类)继承的类提供了一个名为paint() 的方法,在需要重新绘制组件时,调用该方法。
paint() 方法只有一个参数,该参数是Graphics 类的实例。
Graphics 类支持几种确定图形环境状态的特性。
以下列出了部分特性:1.Color:当前绘制颜色,它属于java.awt.Color 类型。
所有的绘制、着色和纯文本输出都将以指定的颜色显示。
2.Font:当前字体,它属于java.awt.Font 类型。
它是将用于所有纯文本输出的字体。
3.Clip:java.awt.Shape 类型的对象,它充当用来定义几何形状的接口。
该特性包含的形状定义了图形环境的区域,绘制将作用于该区域。
通常情况下,这一形状与整个图形环境相同,但也并不一定如此。
4.ClipBounds:java.awt.Rectangle 对象,它表示将包围由Clip 特性定义的Shape 的最小矩形。
它是只读特性。
5.FontMetrics:java.awt.FontMetrics 类型的只读特性。
该对象含有关于图形环境中当前起作用的Font 的信息。
6.Paint Mode:该特性控制环境使用当前颜色的方式。
如果调用了setPaintMode() 方法,那么所有绘制操作都将使用当前颜色。
如果调用了setXORMode() 方法(该方法获取一个Color 类型的参数),那么就用指定的颜色对像素做“XOR”操作。
XOR 具有在重新绘制时恢复初始位模式的特性,因此它被用作橡皮擦除和动画操作。
Graphics 类方法:可以将java.awt.Graphics 支持的非特性方法划分为三个常规类别之下:1.跟踪形状轮廓的绘制方法:draw3DRect() drawArc() drawBytes() drawChars()drawImage() drawLine() drawOval() drawPolygon()drawPolyline() drawRect() drawRoundRect() drawString()2.填充形状轮廓的绘制方法:fill3DRect() fillArc() fillOval()fillPolygon() fillRect() fillRoundRect()3.诸如translate() 之类的杂项方法,它们将图形环境的起点从其缺省值(0,0) 变成其它值。
java实现图片加水印效果
java实现图⽚加⽔印效果图⽚加⽔印代码,这些代码不常⽤,但是⽤到的时候需要注意的地⽅也挺多的,每次都重写⽐较⿇烦,记下来备忘。
代码是图⽚加⽔印的⼀般流程,可根据实际项⽬需要⾃⾏修改。
注:代码在JPG和PNG格式图⽚下测试通过,其他图⽚格式请⾃⾏测试和修改import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import java.io.File;import java.util.Iterator;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageReader;import javax.imageio.ImageWriteParam;import javax.imageio.ImageWriter;import javax.imageio.stream.FileImageInputStream;import javax.imageio.stream.FileImageOutputStream;import org.junit.Test;public class Wjt {@Testpublic void t3() throws Exception {File rootDir = new File("C:/Users/Administrator/Desktop/tem1");String[] fa = { "1.png", "2.jpg" };for (String s : fa) {String f = s;{FileImageInputStream fileImageInputStream = new FileImageInputStream(new File(rootDir, f));Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(fileImageInputStream); //根据图⽚⽂件获取读取器ImageReader imageReader = imageReaders.hasNext() ? imageReaders.next() : null; //检测读取器是否存在imageReader.setInput(fileImageInputStream); //设置读取器输⼊流BufferedImage bufferedImage = imageReader.read(0); //从读取器取BufferedImage,这⾥只有⼀个,所以可以直接写0{ //开始加⽔印Graphics2D graphics2d = bufferedImage.createGraphics(); //取画笔graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); //设置画笔⽂字抗锯齿graphics2d.transform(AffineTransform.getTranslateInstance(bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2)); //将画笔移动到图⽚中央graphics2d.transform(AffineTransform.getRotateInstance(Math.toRadians(45))); //将画笔旋转⼀定弧度float radius = Double.valueOf(Math.sqrt(bufferedImage.getWidth() * bufferedImage.getWidth() + bufferedImage.getHeight() * bufferedImage.getHeight()) / 2).floatValue(); //计算图⽚外切圆半径 Font waterMarkerFont = new Font("微软雅⿊", Font.PLAIN, bufferedImage.getHeight() / 25); //设置画笔要⽤的字体,这⾥可以设置字体样式和⼤⼩graphics2d.setFont(waterMarkerFont); //设置画笔字体graphics2d.setColor(Color.WHITE); //设置画笔颜⾊graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.3F)); //设置画笔操作透明度FontMetrics fontMetrics = graphics2d.getFontMetrics(); //取画笔字体信息String waterMarker = "THIS IS WATERMARK."; //⽔印⽂字int stringWidth = fontMetrics.stringWidth(waterMarker); //计算⽔印⽂字宽度,很多⼈卡在了这⼀步for (float i = -radius; i <= radius; i += (stringWidth + bufferedImage.getHeight() / 25)) { //循环添加⽔印,这⾥可以设置⽔印⽔平距离,单位:pxfor (float j = -radius; j <= radius; j += (fontMetrics.getHeight() + bufferedImage.getHeight() / 25)) { //这⾥可以设置⽔印垂直距离,单位:pxgraphics2d.drawString(waterMarker, i, j); //画⽔印}}graphics2d.dispose(); //释放画笔资源}ImageWriter imageWriter = ImageIO.getImageWriter(imageReader); //根据图⽚⽂件读取器获取图⽚⽂件写⼊器String[] split = f.split("\\.");FileImageOutputStream fileOutputStream = new FileImageOutputStream(new File(rootDir, split[0] + "r." + split[1])); //⽣成⽬标图⽚⽂件路径imageWriter.setOutput(fileOutputStream); //设置写⼊器输出流IIOImage iioImage = new IIOImage(bufferedImage, null, null);ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();if (imageReader.getFormatName().equals("JPEG")) { //jpg格式图⽚可设置输出图⽚⽂件的质量imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); //这⼀⾏固定这样写,跟下⼀⾏搭配imageWriteParam.setCompressionQuality(0.947F); //跟上⼀⾏搭配,设置输出图⽚⽂件的质量}imageWriter.write(null, iioImage, imageWriteParam); //写⽂件imageWriter.dispose(); //关闭写⼊器imageReader.dispose(); //关闭读取器}}}}代码流程在注释中写的很详细了,不多做解释。
java——Graphics
调用paint的一般是repaint()或当显示器刷新的时候调用的类似repaint()的类。
当对于桌面执行了某类操作,改变了桌面上的图象时,jvm收到界面被调整的信息,此时会调用visible是ture的图形组件的repaint()方法对界面重绘。
当然,直接重绘或全部重绘是很亏的,一个是用双缓存技术,另一个是只对桌面上显示的部分重绘。
双缓存是指在缓存内先模拟重绘过程,只把最后成形的结果传给显示器显示。
部分重绘就是指使用repaint(Dimension area)及类似的方法,只重绘与需调整的部分相关的界面。
幸运的是,目前jdk提供的repaint()并不是傻呼呼的就直接重绘所有组件,已经用了上述两种方法优化过了。
所以即使反复调用repaint()也不会有效率的损失。
repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!paint()是提供给用户编程的,往往声明在接口之中,然后用户实现该接口,以拥有重绘的功能。
若要定制某个图形组件的界面,可以重写paint()方法,记得一般习惯这样改写:void paint(Graphics g){super.paint(g);// your code}除了paint(),有的组件会有paintBorder()之类的专门用于某个部分重绘的方法,不过一般是protected 的,在对该类组件扩展的时候可以重写该方法。
最后,graphics是一个抽象类,其实现大都是平台相关的,所以不容易自己创建一个graphics 实例。
一般graphics的实例会由依照你所在的桌面环境给出。
Graphics类及其子类Graphics2D提供的只是一些基本绘图方法,比如画直线、曲线什么的。
所以做一个图形组件的基本思路可以总结为以下过程:选择适合的基本图形组件-> 继承它-> 重写paint等方法-> 在需要刷新图形的时候调用repaint等方法!至于Graphics,先假设它存在,因为真正的Graphics实例只有当程序在jvm上跑的时候才会创建。
Qt期末考试重点知识总结
Qt期末考试重点知识总结第⼀章 hello,Qt#include2 #include3 int main(int argc, char *argv[])4 {5 QApplication app(argc, argv);6 QLabel *label = newQLabel("Hello Qt!");7 label->show();8 return app.exec(); }第⼆章创建对话框1:emit为发射信号;2:当将⼦布局对象添加到⽗布局对象中去,⼦布局对象就会⾃动重定义⾃⼰的⽗对象。
即将主布局装到对话框中时,它就会成为对话框的⼦对象,于是它的所有⼦窗⼝部件就会重定义⾃⼰的⽗对象,从⽽变成对话中的⼦对象;注:Qt会在删除⽗对象的时候⾃动删除其所属的所有⼦对象;3:信号和槽信号和槽机制是Qt编程的基础。
它可以让应⽤程序编程⼈员把这些互不了解的对象绑定在⼀起。
槽与普通的C++函数⼏乎是⼀样的,可以是虚函数;可以被重载;可以是公有的。
保护的或私有的,也可以被其他C++函数直接调⽤;并且,它们的函数可以是任意类型。
槽与普通的C++函数的区别:槽可以与信号连接在⼀起,(信号和槽函数必须有着相同的参数类型,这样信号和槽函数才能成功连接),在这种情况下,每当发射这个信号的时候,就会⾃动调⽤这个槽。
Connect()语句如下:Connect(sender,SIGNAL(signal),receiver,SL OT(slot));sender和receiver是QObject对象指针,signal和slot是不带参数的函数原型。
SIGNALE()和SLOT()宏的作⽤是把他们转换成字符串。
如setupUi()函数建⽴下述连接:Connect(lineEdit,SIGNAL(testChanged(constQString&)),this,SLOT(on_lineEdit_testChang ed()))信号和槽连接的可能性有以下⼏种情况:1)⼀个信号可以连接多个槽;2)多个信号可以连接⼀个槽;3)⼀个信号可以与另外⼀个信号相连接;4)连接可以被删除;第三章创建主窗⼝1:创建菜单和⼯具栏的步骤:1)创建并且设置动作;2)创建菜单并且把动作添加到菜单上;3)创建⼯具栏并且把动作添加到⼯具栏上;注:⼀个动作就是⼀个可以添加到任意数量的菜单和⼯具栏上的项。
java调用打印机方式二
java调⽤打印机⽅式⼆⼀、主类:package org.jeecg.print;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Stroke;import java.awt.print.Book;import java.awt.print.PageFormat;import java.awt.print.Paper;import java.awt.print.Printable;import java.awt.print.PrinterException;import java.awt.print.PrinterJob;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;/*** @Author: shafei* @Date: 2020-04-15 10:30* @Version: V1.0* @Description:*/public class PrintTest {protected static final String DIAN_MING = "伊晨Bayby童装⼯⼚";protected static final String SHOU_HUO_REN = "⼤飞家";protected static final String SHOU_HUO_REN_BEI_ZHU = "⽆";protected static final String MAIJIA_DIZHI = "A区三街01114号";protected static final String MAIJIA_DH = "186********";protected static final String MAIJIA_WX = "yichenbaby0";public static void main(String[] args) {OrderVo orderVo = new OrderVo();orderVo.setBuyer("⼤飞家");orderVo.setRemark("⽆");orderVo.setSeller(DIAN_MING);orderVo.setAddress(MAIJIA_DIZHI);orderVo.setIphone(MAIJIA_DH);orderVo.setWxno(MAIJIA_WX);// orderVo.setTotalMoney(0);List<ProductVo> products = new ArrayList<ProductVo>();ProductVo productVo = new ProductVo();productVo.setName("忍者短袖(红)");productVo.setPrice(26.00);productVo.setAmount(8);productVo.setSize("100M");ProductVo productVo2 = new ProductVo();productVo2.setName("忍者短袖(蓝)");productVo2.setPrice(26.00);productVo2.setAmount(4);productVo2.setSize("103M");products.add(productVo);products.add(productVo2);new PrintTest().printDefault(orderVo, products);}private void printDefault(final OrderVo orderVo, final List<ProductVo> products ) {if (PrinterJob.lookupPrintServices().length > 0) {/** 打印格式*/PageFormat pageFormat = new PageFormat();// 设置打印起点从左上⾓开始,从左到右,从上到下打印pageFormat.setOrientation(PageFormat.PORTRAIT);/** 打印页⾯格式设置*/Paper paper = new Paper();// 设置打印宽度(固定,和具体的打印机有关)和⾼度(跟实际打印内容的多少有关)paper.setSize(140, 450);// 设置打印区域打印起点坐标、打印的宽度和⾼度paper.setImageableArea(0, 0, 135, 450);// paper.setImageableArea(0, 0, 135, 450);pageFormat.setPaper(paper);// 创建打印⽂档Book book = new Book();book.append(new Printable() {@Overridepublic int print(Graphics graphics, PageFormat pageFormat,int pageIndex) throws PrinterException {if (pageIndex > 0) {return NO_SUCH_PAGE;}Graphics2D graphics2D = (Graphics2D) graphics;Font font = new Font("宋体", Font.PLAIN, 5);graphics2D.setFont(font);drawString(graphics2D, "//////////////////////////////",10, 17, 119, 8);font = new Font("宋体", Font.PLAIN, 7);graphics2D.setFont(font);int yIndex = 30;int lineHeight = 10;int lineWidth = 120;Color defaultColor = graphics2D.getColor();Color grey = new Color(145, 145, 145);// 收货信息// yIndex = drawString(graphics2D,// "发件⼈:"+DIAN_MING+"(微信:yichenbaby0)", 10, yIndex,// lineWidth, lineHeight);yIndex = drawString(graphics2D, "收货⼈:" + orderVo.getBuyer(), 10, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "收货⼈备注信息:"+ orderVo.getRemark(), 10, yIndex + lineHeight,lineWidth, lineHeight);// 收货信息边框Stroke stroke = new BasicStroke(0.5f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL, 0, new float[] { 4, 4 }, 0);graphics2D.setStroke(stroke);graphics2D.drawRect(5, 10, 129, yIndex);// 商品名称lineWidth = 129;lineHeight = 8;graphics2D.setFont(new Font("宋体", Font.BOLD, 8));graphics2D.setColor(defaultColor);yIndex = drawString(graphics2D, DIAN_MING, 5, yIndex+ lineHeight + 20, lineWidth, 12);graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));graphics2D.setColor(grey);// yIndex = drawString(graphics2D, "操作员:⾦⾖ "// + getCurrDate(), 5, yIndex + lineHeight + 2,// lineWidth, lineHeight);yIndex = drawString(graphics2D, "时间:"+ getCurrDate(), 5, yIndex + lineHeight + 2,lineWidth, lineHeight);// yIndex = drawString(graphics2D, "⽇期:"+getCurrDate(), 5 +// lineWidth/2, yIndex, lineWidth, lineHeight);// yIndex = drawString(graphics2D, "⽇期:"+getCurrDate(), 5 +// lineWidth/2, yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "商品名", 5, yIndex+ lineHeight * 2 - 5, lineWidth, lineHeight);// yIndex = drawString(graphics2D, "尺码", (lineWidth/10)*4,// yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "单价", (lineWidth / 10) * 8,yIndex, lineWidth, lineHeight);yIndex = drawString(graphics2D, "数量",(lineWidth / 10) * 10, yIndex, lineWidth,lineHeight);//总合计价格int total = 0;double totalPrice = 0;for (ProductVo productVo : products) {graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));//商品名称yIndex = drawString(graphics2D, productVo.getName(), 5,yIndex + 15, (lineWidth / 10) * 7, 10);graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));graphics2D.setColor(grey);// yIndex = drawString(graphics2D, "尺码:" + "100M", 5,// yIndex + 11, lineWidth, lineHeight);// 尺码//单价yIndex = drawString(graphics2D, productVo.getPrice()+"",(lineWidth / 10) * 8, yIndex, lineWidth,lineHeight);//数量yIndex = drawString(graphics2D, productVo.getAmount()+"",(lineWidth / 10) * 10, yIndex, lineWidth,lineHeight);graphics2D.setFont(new Font("宋体", Font.PLAIN, 7));yIndex = yIndex + 2;graphics2D.drawLine(5, yIndex, 5 + lineWidth, yIndex);total=total+productVo.getAmount();totalPrice=totalPrice+(productVo.getPrice()*productVo.getAmount()); }graphics2D.setColor(defaultColor);// yIndex = drawString(graphics2D, "会员名称:⼩清新", 5, yIndex +// lineHeight * 2, lineWidth, lineHeight);yIndex = drawString(graphics2D, "总数:"+total, 5, yIndex+ lineHeight, lineWidth, lineHeight);yIndex = drawString(graphics2D, "总计:"+totalPrice, 5, yIndex+ lineHeight, lineWidth, lineHeight);// yIndex = drawString(graphics2D, "收款:100.00", 5, yIndex// + lineHeight, lineWidth, lineHeight);// yIndex = drawString(graphics2D, "找零:44.70", 5, yIndex// + lineHeight, lineWidth, lineHeight);graphics2D.setFont(new Font("宋体", Font.PLAIN, 6));graphics2D.setColor(grey);// yIndex = drawString(graphics2D, "微信:"+orderVo.getWxno(), 5, yIndex // + lineHeight * 2, lineWidth, lineHeight);yIndex = drawString(graphics2D, "微信:"+MAIJIA_WX, 5, yIndex+ lineHeight * 2, lineWidth, lineHeight);// yIndex = drawString(graphics2D, "地址:" + orderVo.getAddress(), 5,// yIndex + lineHeight, lineWidth, lineHeight);yIndex = drawString(graphics2D, "地址:" + MAIJIA_DIZHI, 5,yIndex + lineHeight, lineWidth, lineHeight);yIndex = yIndex + 20;graphics2D.drawLine(0, yIndex, 140, yIndex);return PAGE_EXISTS;}private String getCurrDate() {Date currDate = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sdf.format(currDate);}}, pageFormat);// 获取默认打印机PrinterJob printerJob = PrinterJob.getPrinterJob();printerJob.setPageable(book);try {printerJob.print();} catch (PrinterException e) {e.printStackTrace();System.out.println("打印异常");}} else {System.out.println("没法发现打印机服务");}}/*** 字符串输出** @param graphics2D* 画笔* @param text* 打印⽂本* @param x* 打印起点 x 坐标* @param y* 打印起点 y 坐标* @param lineWidth* ⾏宽* @param lineHeight* ⾏⾼* @return 返回终点 y 坐标*/private static int drawString(Graphics2D graphics2D, String text, int x,int y, int lineWidth, int lineHeight) {FontMetrics fontMetrics = graphics2D.getFontMetrics();if (fontMetrics.stringWidth(text) < lineWidth) {graphics2D.drawString(text, x, y);return y;} else {char[] chars = text.toCharArray();int charsWidth = 0;StringBuffer sb = new StringBuffer();for (int i = 0; i < chars.length; i++) {if ((charsWidth + fontMetrics.charWidth(chars[i])) > lineWidth) { graphics2D.drawString(sb.toString(), x, y);sb.setLength(0);y = y + lineHeight;charsWidth = fontMetrics.charWidth(chars[i]);sb.append(chars[i]);} else {charsWidth = charsWidth + fontMetrics.charWidth(chars[i]); sb.append(chars[i]);}}if (sb.length() > 0) {graphics2D.drawString(sb.toString(), x, y);y = y + lineHeight;}return y - lineHeight;}}}⼆、需要⽤到的两个对象package org.jeecg.print;import lombok.Data;/*** @Author: shafei* @Date: 2020-04-15 10:33* @Version: V1.0* @Description:*/@Datapublic class ProductVo {private String name;private double price;private int amount;private String size;private String iphone;private String wxno;}package org.jeecg.print;import lombok.Data;/*** @Author: shafei* @Date: 2020-04-15 10:31* @Version: V1.0* @Description:*/@Datapublic class OrderVo {private String buyer;private String remark;private String seller;private String address;private String iphone;private String wxno;}。
如何用Java对PDF文件进行电子签章
如何⽤Java对PDF⽂件进⾏电⼦签章⼀、概述⼆、技术选型三、⽣成⼀个图⽚签章四、如何按模板⽣成PDF⽂件五、如何⽣成PKSC12证书六、如何⽣成⼀个⾼清晰的签章七、如何进⾏多次PDF签名⼋、总结⼀、概述印章是我国特有的历史⽂化产物,古代主要⽤作⾝份凭证和⾏驶职权的⼯具。
它的起源是由于社会⽣活的实际需要。
早在商周时代,印章就已经产⽣。
如今的印章已成为⼀种独特的,融实⽤性和艺术性为⼀体的艺术瑰宝。
传统的印章容易被坏⼈、⼩⼈私刻;从⽽新闻鲜有报道某某私刻公章,侵吞国家财产。
随着计算机技术、加密技术及图像处理技术的发展,出现了电⼦签章。
电⼦签章是电⼦签名的⼀种表现形式,利⽤图像处理技术、数字加密技术将电⼦签名操作转化为与纸质⽂件盖章操作相同的可视效果,同时利⽤电⼦签名技术保障电⼦信息的真实性和完整性以及签名⼈的不可否认性。
电⼦签章与数字证书⼀样是⾝份验证的⼀种⼿段,泛指所有以电⼦形式存在,依附在电⼦⽂件并与其逻辑关联,可⽤以辨识电⼦⽂件签署者⾝份,保证⽂件的完整性,并表⽰签署者同意电⼦⽂件所陈述事实的内容。
⼀般来说对电⼦签章的认定都是从技术⾓度⽽⾔的。
主要是指通过特定的技术⽅案来鉴别当事⼈的⾝份及确保电⼦资料内容不被篡改的安全保障措施。
电⼦签章常于发送安全电⼦邮件、访问安全站点、⽹上招标投标、⽹上签约、安全⽹上公⽂传送、公司合同、电⼦处⽅笺等。
电⼦签章是⼀个很复杂的问题,⼤到有相关的电⼦签章系统;今天分享⼀下如何把电⼦签章应⽤到电⼦处⽅笺的PDF⽂件⾥。
⼆、技术选型⽬前主流处理PDF⽂件两个jar包分别是:1. 开源组织Apache的PDFBox,官⽹2. ⼤名⿍⿍adobe公司的iText,官⽹,其中iText⼜分为iText5和iText7如何在PDFBox、iText5和iText7选出合适⾃⼰项⽬的技术呢?对⽐PDFBox、iText5和iText7这三者:1. PDFBox的功能相对较弱,iText5和iText7的功能⾮常强悍;2. iText5的资料⽹上相对较多,如果出现问题容易找到解决⽅案;PDFBox和iText7的⽹上资料相对较少,如果出现问题不易找到相关解决⽅案;3. 通过阅读PDFBox代码⽬前PDFBox还没提供⾃定义签章的相关接⼝;iText5和iText7提供了处理⾃定义签章的相关实现;4. PDFBox只能实现把签章图⽚加签到PDF⽂件;iText5和iText7除了可以把签章图⽚加签到PDF⽂件,还可以实现直接对签章进⾏绘制,把⽂件绘制到签章上。
java 文字处理
java 文字处理在Swing中,在窗体中绘制文字并对文字进行设置宽度与高度需要用到java.awt 包中的FontMetrics类和Graphics2D类中的drawString()方法。
1.绘制文本绘制文本需要使用Graphics2D类中的drawString()方法。
该方法的主要重载形式如下:●V oid drawstring( String str , int x ,int y ) 绘制指定文本,x与y指定文本首字符的基线所对应的坐标。
●V oid drawstring( String str , float x ,float y ) 同上,只不过x与y是float类型的数值。
绘制文本内容,可以事先设置文本的字体,这需要使用Font类。
Font类的构造方法主要有如下两种重载形式。
●Font(String name , int style , int size) 创建一个Font对象,其中,name表示字体名称,例如“黑体”、“宋体”和“隶书”等;style表示字体样式,字体样式如表11-2所示;size表示字体大小。
●Font(Font f) 根据f的字体属性创建一个新的Font对象。
创建好的Font对象,可以赋给Graphics类或Graphics2D类的对象,调用的是对象的setFont(Font f)方法,形式如下:也可以将这行代码分开,形式如下:2.文字的宽度与高度绘制一个字符串,需要调用Graphics2D类的draw(String str , int x , int y)方法,这个方法中x与y分别表示字符串基线起始点的x与y坐标。
在java.awt包中有一个FontMetrics类,该类可以处理字符串的高度与宽度,相关方法如表11-3所示。
表11-3 FontMetrics类的常用方法要获取上下文中的FontMetrics对象,需要调用Graphics2D类对象的并用标签setFont()、setText()方法设置标签显示的文字与字体。
Java游戏编程原理与实践教程课件 第3章--陈锐 夏敏捷主编
3.5 Java 2D简介 3.5.3 Graphics2D的图形绘制 Graphics2D是Graphics类的子类,也是一个抽象类,不能实例化Graphics2D对象, 为了使用Graphics2D,可以通过Graphics对象传递一个组件的绘制方法给 Graphics2D对象。方法如下面代码段所示: public void paint(Graphics g){ Graphics2D g2=(Graphics 2D)g; …… } Java 2D API 提供了几种定义点、直线、曲线、矩形和椭圆等常用几何对象的类, 这些新几何类是 java.awt.geom 包的组成部分,包括如Point2D、Line2D、Arc2D、 Rectangle2D、Ellipse2D等。每个类都有单精度和双精度两种象素定义方式,如 Point2D.double和Point2D.float,Line2D.double和Lint2D.float等,用这些类可以 很容易的绘制基本的二维图形对象。 【例3-5】使用Graphics 2D绘制直线、矩形和椭圆。程序运行结果见图3-11。
3.5 Java 2D简介 3.5.1 Java 2D API Java 2D API(Application Programming Interface) 增强了抽象窗口工具包 (AWT) 的图形、文本和图像功能,可以创建高级图形库,开发更为强大的用户接口和 新型的 Java 应用程序。Java 2D API 对 AWT 进行了扩展,提供了更加灵活、功 能更全面的绘制包,使其支持更多的图形绘制操作。 Java 2D是Java核心类库的一部分,它包含的包有: • java.awt • java.awt.image • java.awt.color • java.awt.font • java.awt.geom • java.awt.print • java.awt.image.renderable • com.sun.image.codec.jpeg
QT类参考
相关函数
z void qAddPostRoutine ( QtCleanUpFunction p ) z const char * qVersion () z bool qSysInfo ( int * wordSize, bool * bigEndian ) z void qDebug ( const char * msg, ... ) z void qWarning ( const char * msg, ... ) z void qFatal ( const char * msg, ... ) z void qSystemWarning ( const char * msg, int code ) z void Q_ASSERT ( bool test ) z void Q_CHECK_PTR ( void * p ) z QtMsgHandler qInstallMsgHandler ( QtMsgHandler h )
公有槽
z void quit () z void closeAllWindows ()
信号
z void lastWindowClosed () z void aboutToQuit () z void guiThreadAwake ()
静态公有成员
z QStyle & style () z void setStyle ( QStyle * style ) z QStyle * setStyle ( const QString & style ) z int colorSpec () z void setColorSpec ( int spec ) z QCursor * overrideCursor () z void setOverrideCursor ( const QCursor & cursor, bool replace = FALSE ) z void restoreOverrideCursor () z bool hasGlobalMouseTracking () z void setGlobalMouseTracking ( bool enable ) z QPalette palette ( const QWidget * w = 0 ) z void setPalette ( const QPalette & palette, bool informWidgets = FALSE,
java动态文字的课程设计
广西科技大学Java课程设计题目实现输出文字的抖动显示所在院系计算机工程系学生姓名涂召华专业班级通信工程102学号201000402088指导教师彭宏庆2012年6 月13 日一.总体设计本系统共包括1个Java源文件。
1.Java源文件及其功能如表1所示。
JumpTextApplet类序号文件名主要功能备注1 JumpTextApplet实现文字的抖动显示唯一的类需求分析:在日常生活中,此功能实现的用处不是很明显,但是在一些专门的效果图设计,要以这个为基础来设计一些特效,可增加观赏性和使用性,方便用户操作。
项目介绍:本课程设计的结果是,使得输出的文字是抖动显示的,首先要设置字体的文字的线程,字体高度,跳动速度和基线,文字颜色与背景颜色,实现跳动的Image对象,实现跳动的Graphics对象,显示字体的FontMetrics对象流程图:待显示的文字文字线程字体高度跳动速度和基线实现文字颜色和背景颜色实现跳动image对象显示字体对象抖动的文字输出二、源代码见文件JumpTextApplet.javaimport java.awt.*;import java.applet.*;import java.util.Random;//跳动文字public class JumpTextApplet extends Applet implements Runnable{String message; //待显示的文本信息Thread jumpThread; //实现跳动文字的线程int fontHeight,speed,baseline; //字体高度,跳动速度和基线Color textColor,bgColor; //文字颜色与背景颜色Image jumpImage; //实现跳动的Image对象Graphics jumpGraphics; //实现跳动的Graphics对象boolean normal; //文字是否跳动的标志Font font; //显示字体FontMetrics fontMetric; //显示字体的FontMetrics对象Color randomColors[]; //随机生成颜色boolean randomColor; //是否是随机颜色public void init(){ //初始化Graphics graphics = getGraphics(); //得到graphics对象 Dimension dim=getSize(); //得到尺寸fontHeight=dim.height-10; //根据Applet尺寸设置文字高度jumpImage=createImage(dim.width,dim.height); //创建Image对象jumpGraphics= jumpImage.getGraphics(); //得到Graphics 对象message=getParameter("text"); //得到显示文字if (message==null){message="涂召华跳动显示的哦"; //设置默认文字 }int textWidth=dim.width-(message.length() + 1)*5-10;//设置文字宽度do{graphics.setFont(new Font("TimesRoman", 1,fontHeight)); //设置显示字体fontMetric = graphics.getFontMetrics(); //得到FontMetric对象if(fontMetric.stringWidth(message)>textWidth) //根据文字宽度调整其高度fontHeight--;}while(fontMetric.stringWidth(message) > textWidth);{ baseline = getSize().height -fontMetric.getMaxDescent(); //调整显示基线位置}font = new Font("TimesRoman", 1, fontHeight); //得到字体实例String param; //参数字符串if((param = getParameter("TEXTCOLOR")) == null) //得到文本颜色textColor = Color.yellow; //设置默认文本颜色elsetextColor= new Color(Integer.parseInt(param)); //设置文本颜色if((param = getParameter("BGCOLOR")) == null) //得到背景颜色bgColor = Color.lightGray; //设置默认背景颜色elsebgColor = new Color(Integer.parseInt(param));setBackground(bgColor); //设置背景颜色if((param = getParameter("SPEED")) != null) //得到跳动速度speed = Integer.valueOf(param).intValue();if(speed == 0)speed = 200; //设置默认跳动速度if((param = getParameter("RANDOMCOLOR")) != null) //得到是否是随机颜色参数randomColor =(Integer.valueOf(param).intValue()!=0); //参数值不为零,则为随机颜色if((param = getParameter("NORMAL")) != null) //得到是否是随机颜色参数normal = (Integer.valueOf(param).intValue()!=0);//参数值不为零,则为随机颜色if (randomColor){ //初始化随机颜色数组Random random=new Random(); //实例化Random对象int r,g,b; //颜色的RGB值for (int i=0;i<10;i++){r=random.nextInt(255); //得到0到255之间的随机值g=random.nextInt(255);b=random.nextInt(255);Color randomc=new Color(r,g,b); //生成颜色实例randomColors[i]=randomc; //设置数组值}}jumpThread = new Thread(this); //实例化跳动文字线程 }public void start(){ //开始运行线程if(jumpThread == null) {jumpThread = new Thread(this);}jumpThread.start();}public void run(){ //线程运行主体while(jumpThread!=null) {try{Thread.sleep(speed); //线程休眠,即跳动间隔时间}catch(InterruptedException ex) {}repaint(); //重绘屏幕}System.exit(0); //退出程序}public void paint(Graphics g) { //绘制Appletif(normal) { //如果是静态文本g.setColor(bgColor); //设置当前颜色g.fillRect(0, 0, getSize().width,getSize().height); //绘制填充矩形g.setColor(textColor); //设置当前颜色g.setFont(font); //设置当前字体g.drawString(message, (getSize().width - fontMetric.stringWidth(message)) / 2, baseline); //绘出字符串}}public void update(Graphics g){ //更新AppletjumpGraphics.setColor(bgColor); //设置当前颜色jumpGraphics.fillRect(0, 0, getSize().width,getSize().height); //绘制填充矩形jumpGraphics.setColor(textColor); //设置当前颜色jumpGraphics.setFont(font); //设置字体if(!normal){ //如果是跳动文字int xpoint = 0;for(int j = 0; j < message.length(); j++){if(randomColor){Color color;while(bgColor == (color =randomColors[Math.min(9, (int)(Math.random()*10))])); //得到颜色数组中与背景色不同的一个随机颜色jumpGraphics.setColor(color); //设置当前颜色}xpoint += (int)(Math.random() * 10); //单个字符的X坐标int ypoint = baseline - (int)(Math.random() * 10); //单个字符的Y坐标String s1 = message.substring(j, j + 1);jumpGraphics.drawString(s1, xpoint, ypoint); xpoint += fontMetric.stringWidth(s1);}}else { //如果是静态文本jumpGraphics.drawString(message,(getSize().width - fontMetric.stringWidth(message)) / 2, baseline); //绘制字符串}g.drawImage(jumpImage, 0, 0, this); //绘制Image}public JumpTextApplet() { //构造函数speed = 100; //初始速度normal = false; //初始时为动态文本randomColors = new Color[10]; //初始化随机颜色数组randomColor = false;}}String message; //显示文本int direct,phase; //运动方向参数Thread thread; //波浪运动线程char words[]; //显示文本的字符数组Image image; //Image对象Graphics graphics; //Graphics对象Color colors[]; //显示文本颜色private Font font; //显示字体private FontMetrics fontMetric; //显示字体的 FontMetrics对象public void init() {direct=1; //初始方向值phase = 0;message = getParameter("Text"); //得以显示文本if (message==null){ //如果文本为空message="波浪文字"; //设置默认文本}setBackground(Color.black); //设置背景色words = new char [message.length()]; //初始化显示字符数组message.getChars(0,message.length(),words,0);image = createImage(getSize().width,getSize().height); //得到Image实例graphics = image.getGraphics(); //得到Graphics实例font = new Font("TimesRoman",Font.BOLD,36); //设置显示字体fontMetric=getFontMetrics(font); //得到字体的FontMetric对象graphics.setFont(font); //设置显示字体float h;colors = new Color[message.length()]; //初始化颜色数组for (int i = 0; i < message.length(); i++) {h = ((float)i)/((float)message.length());colors[i] = new Color(Color.HSBtoRGB(h,1.0f,1.0f)); //填充颜色数组数据}}public void start() {if(thread == null) {thread = new Thread(this); //实例化线程thread.start(); //运行线程}}public void run() {while (thread != null) {try {Thread.sleep(200); //线程休眠}catch (InterruptedException e) {}repaint(); //重绘屏幕}}public void update(Graphics g) {int x, y; //显示字符的X坐标,Y坐标double ang;int Hrad = 12;int Vrad = 12;graphics.setColor(Color.black); //设置当前颜色graphics.fillRect(0,0,getSize().width,getSize().height); //填充背景phase+=direct;phase%=8;for(int i=0;i<message.length();i++) {ang = ((phase-i*direct)%8)/4.0*Math.PI; //运动角度x = 20+fontMetric.getMaxAdvance()*i+(int)(Math.cos(ang)*Hrad); //字符的X坐标y = 60+ (int) (Math.sin(ang)*Vrad); //字符的Y坐标graphics.setColor(colors[(phase+i)%message.length()]); //设置文本颜色graphics.drawChars(words,i,1,x,y); //显示字符}g.drawImage(image,0,0,this); //绘制Image}public void paint(Graphics g) {update(g);}}三.运行效果四.设计总结经过短暂的一周的Java程序设计,使我又学到了很多的知识,尤其是运用Java知识去解决实际问题的能力又得到了很大的提高。
java font 方法
java font 方法Java中的Font类是用于处理字体的类,它提供了许多方法来设置和操作字体。
在本文中,我们将介绍一些常用的Font方法,并讨论如何在Java中使用这些方法来处理字体。
1. 创建字体在Java中,我们可以使用Font类的构造函数来创建字体。
构造函数有多种重载形式,可以根据需要选择合适的构造函数。
例如,我们可以使用以下代码创建一个默认字体:```javaFont font = new Font("宋体", Font.PLAIN, 12);```这里的参数指定了字体名称、样式和大小。
在这个例子中,我们创建了一个宋体字体,样式为常规,大小为12。
2. 设置字体样式Font类提供了一些方法来设置字体的样式,例如设置字体的粗细、倾斜和下划线等。
下面是一些常用的示例代码:```javaFont boldFont = font.deriveFont(Font.BOLD); // 设置为粗体Font italicFont = font.deriveFont(Font.ITALIC); // 设置为斜体Font underlineFont = font.deriveFont(Font.PLAIN |Font.UNDERLINE); // 设置为带下划线```3. 获取字体信息Font类还提供了一些方法来获取字体的相关信息,例如字体的名称、样式和大小等。
以下是一些示例代码:```javaString fontName = font.getName(); // 获取字体名称int fontStyle = font.getStyle(); // 获取字体样式int fontSize = font.getSize(); // 获取字体大小```4. 测量文本尺寸在某些情况下,我们可能需要知道特定文本在给定字体下的宽度和高度。
Font类提供了一个方法来测量文本的尺寸。
以下是一个示例代码:```javaFontMetrics metrics = graphics.getFontMetrics(font);int textWidth = metrics.stringWidth("Hello, World!"); // 获取文本宽度int textHeight = metrics.getHeight(); // 获取文本高度```这里的graphics是一个Graphics对象,用于绘制文本。
java计算文本宽度中英文混合
java计算文本宽度中英文混合
在Java中计算文本宽度时,需要考虑中英文混合的情况。
一种
常见的方法是使用Java的FontMetrics类来获取文本的宽度。
首先,需要创建一个FontMetrics对象,然后使用getStringBounds方法
来获取文本的边界。
接着,可以使用边界的宽度来表示文本的宽度。
在计算中英文混合文本宽度时,需要注意中文字符和英文字符的宽
度不同,通常中文字符的宽度要大于英文字符。
因此,在计算文本
宽度时,需要根据字符的类型来进行不同的处理。
可以通过遍历文
本中的每个字符,使用Character类的方法来判断字符的类型,然
后根据类型来计算宽度。
另外,还可以考虑使用第三方库或工具来
简化文本宽度的计算,比如Apache Commons Lang库中的
StringUtils类提供了一些方法来计算字符串的宽度。
总之,在
Java中计算中英文混合文本的宽度需要考虑字符的类型和宽度差异,以及选择合适的方法来进行计算。
java 判断文字是否超出屏幕范围的方法
文章标题:如何使用Java判断文字是否超出屏幕范围的方法1. 引言在日常的软件开发中,经常会遇到需要判断文字是否超出屏幕范围的情况。
特别是在移动设备上,屏幕尺寸和分辨率的多样性给文字显示带来了挑战。
在Java开发中,我们可以通过一些方法来判断文字是否超出屏幕范围,从而进行相应的处理。
本文将介绍几种常用的方法,帮助开发者更好地处理文字显示的问题。
2. 获取屏幕尺寸在Java中,我们可以通过Toolkit类来获取屏幕的尺寸信息。
代码如下:```javaToolkit toolkit = Toolkit.getDefaultToolkit();Dimension screenSize = toolkit.getScreenSize();int screenWidth = screenSize.width;int screenHeight = screenSize.height;```3. 计算文字尺寸接下来,我们可以使用FontMetrics类来计算文字的尺寸。
代码如下:```javaFontMetrics fontMetrics = graphics.getFontMetrics(font);int textWidth = fontMetrics.stringWidth(text);int textHeight = fontMetrics.getHeight();```4. 判断文字是否超出屏幕范围有了屏幕尺寸和文字尺寸的信息,我们就可以判断文字是否超出屏幕范围了。
代码如下:```javaif (textWidth > screenWidth || textHeight > screenHeight) { System.out.println("文字超出屏幕范围");} else {System.out.println("文字未超出屏幕范围");}```5. 其他方法除了上述方法外,我们还可以使用JavaFX中的Text类来实现文字的布局和绘制,从而更灵活地处理文字显示的问题。
java生成文字图片的示例代码
java⽣成⽂字图⽚的⽰例代码本⽂主要介绍了java ⽣成⽂字图⽚的⽰例代码,分享给⼤家,具体如下:import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;public class FontImage {public static void main(String[] args) throws Exception {createImage("请A1003到3号窗⼝", new Font("宋体", Font.BOLD, 30), new File("e:/a.png"), 4096, 64);createImage("请A1002到2号窗⼝", new Font("⿊体", Font.BOLD, 35), new File("e:/a1.png"), 4096, 64);createImage("请A1001到1号窗⼝", new Font("⿊体", Font.PLAIN, 40), new File("e:/a2.png"), 4096, 64);}// 根据str,font的样式以及输出⽂件⽬录public static void createImage(String str, Font font, File outFile,Integer width, Integer height) throws Exception {// 创建图⽚BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();g.setClip(0, 0, width, height);g.setColor(Color.black);g.fillRect(0, 0, width, height);// 先⽤⿊⾊填充整张图⽚,也就是背景g.setColor(Color.red);// 在换成⿊⾊g.setFont(font);// 设置画笔字体/** ⽤于获得垂直居中y */Rectangle clip = g.getClipBounds();FontMetrics fm = g.getFontMetrics(font);int ascent = fm.getAscent();int descent = fm.getDescent();int y = (clip.height - (ascent + descent)) / 2 + ascent;for (int i = 0; i < 6; i++) {// 256 340 0 680g.drawString(str, i * 680, y);// 画出字符串}g.dispose();ImageIO.write(image, "png", outFile);// 输出png图⽚}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
诺基亚智能机(s60v3)如何更换字体
想让你的手机变得个性么?想让你的手机更华丽么?换个字体可能会有效果哦!今天和大家分享一下诺基亚智能机(s60v3)如何更换字体。
字体文件分为两种,直装版和非直装版的。
这两种字体没有什么差别,大家可以放心安装。
安装字体首先要安装字体驱动,名字为:FontRouter[1].LT.for.v9.Build20071109.unsigned.sis(36.45KB),比软件一般为为签名,安装前请签名。
装好字体驱动后(个人建议装到内存卡,方便出现问题处理)下一步要解决字体文件问题,字体文件可以到塞班智能手机论坛或OPDA 论坛下载。
下载好字体文件(以.ttf版为例)后将其放到e盘data文件夹下的fonts里,这些工作做完后,就该调配配置文件了。
下面是配置文件的具体分析:; FontRouter LT设置文件,注释行第一字符必须是“;”[Global];全局选项区段,其中的所有选项均影响整体功能或者效果。
Enable=1;是否开启FontRouter.;缺省: 1NativeFont=1; 1-支持GDR字体,0-不支持GDR字体;缺省: 1LogLevel=1;日志详细程度: 1-只记录致命错误, 2-只记录错误, 3-只记录警告, 4-记录所有信息, 5-记录运行bug;日志所在路径"C:\Logs\FontRouter";缺省: 4ForceAntiAliased=4;位图字体设置(仅在SymbianOS 7或以上版本系统起作用) ; 0 -默认效果; 1 -倾向于“单色点阵效果”; 2 -强制“单色点阵效果”; 3 -倾向于“反锯齿效果”; 4 -强制“反锯齿效果”; 5 -倾向于Symbian 9.2的Sub-pixel点阵格式; 6 -强制Symbian 9.2的Sub-pixel点阵格式;缺省: 4FixFontMetrics=1;东亚字体修正; 0 -不修正; 1 -模拟Nokia中文字体修正;缺省: 0FixCharMetrics=1;对FixFontMetrics不适当修正进行自动修正; 0 -不修正; 1 -自动修正;缺省: 0;不启用的字体文件,必须是绝对路径如:;DisableFontFile=Z:\Resource\Fonts\c;DisableFontFile=cZoomRatio=100ZoomMinSize=0ZoomMaxSize=48; ZoomRatio用于所有字体的按比例缩放,取值为百分比(不含“%”),默认值为100。
js计算文字宽度的方法
js计算文字宽度的方法【原创实用版4篇】篇1 目录1.计算文字宽度的背景和需求2.JavaScript 中计算文字宽度的方法3.使用 Canvas 元素绘制文字并获取宽度4.使用 HTML5 的丈量字体功能计算文字宽度5.使用第三方库计算文字宽度6.总结和展望篇1正文1.计算文字宽度的背景和需求在网页设计和排版中,我们常常需要知道一段文字的宽度,以便为其设置合适的容器宽度,保证文字在一定范围内不会被截断或者显得过于拥挤。
在 JavaScript 中,我们可以通过一些方法来计算文字的宽度。
2.JavaScript 中计算文字宽度的方法JavaScript 提供了一些 API 来计算文字的宽度。
下面我们将介绍几种常用的方法。
3.使用 Canvas 元素绘制文字并获取宽度我们可以使用 Canvas 元素绘制文字,然后通过获取 Canvas 的宽度来计算文字的宽度。
以下是一个示例:```javascriptfunction getTextWidth(text, fontSize, fontFamily) {const canvas = document.createElement("canvas");const context = canvas.getContext("2d");context.font = `${fontSize}px ${fontFamily}`;const textWidth = context.measureText(text).width;return textWidth;}```4.使用 HTML5 的丈量字体功能计算文字宽度HTML5 提供了`font-metrics`属性,可以获取字体的宽度、高度等信息。
但该属性在计算文字宽度时,仅支持直接设置在 HTML 元素上的字体,不支持通过 CSS 设置的字体。
以下是一个示例:```javascriptfunction getTextWidth(text, fontSize, fontFamily) {const fontMetrics =window.getComputedStyle(document.documentElement).fontMetrics() ;const textWidth = fontMetrics.width / fontMetrics.size * fontSize;return textWidth;}```5.使用第三方库计算文字宽度有一些第三方库提供了计算文字宽度的功能,例如 jQuery、latool 等。
汉字的宽度和字符的关系
汉字的宽度和字符的关系1 汉字的宽度和字符的关系汉字是中文的基础,也是中文的瑰宝。
随着计算机技术的不断发展,汉字的输入和输出越来越方便,但是,有一个问题一直困扰着许多人,那就是汉字的宽度和字符的关系。
本文将从汉字的宽度的原理、计算方法、特殊符号的宽度以及如何解决汉字宽度问题几个方面详细阐述。
2 汉字的宽度原理要理解汉字的宽度,首先需要了解文字在计算机中的存储方式。
汉字在计算机中采用的是“区位码”(也即GB2312码)的编码方式,即每个汉字由两个字节组成。
汉字的宽度由其所在字体的宽度、字符字体的大小以及是否加粗等三个方面共同决定。
不同的字体、大小、粗细等属性都会影响字符的宽度。
3 汉字宽度的计算方法我们可以通过编程的方式计算汉字的宽度,常见的计算方法如下:第一种方法:使用字符串的length()方法例如,以下代码计算字符串“汉字”的宽度:String s = “汉字”;int width = s.length();System.out.println(“宽度为:”+ width);输出的结果为“宽度为:2”。
第二种方法:使用FontMetrics类计算通过使用FontMetrics类的stringWidth()方法可以得到字符串在特定字体下的宽度。
例如,以下代码计算字符串“汉字”的宽度:Font font = new Font(“SimSun”, Font.PLAIN, 12);FontMetrics fm = getFontMetrics(font);int width = fm.stringWidth(“汉字”);System.out.println(“宽度为:”+ width);输出的结果为“宽度为:24”。
4 特殊符号的宽度与汉字相比,英文字符的宽度是固定的,一个字符所占的宽度始终为1个字符宽度(也就是8个像素)。
而汉字则不同,它的宽度会根据字体的不同而有不同的宽度。
除了汉字和英文字符,还有很多特殊符号也会影响字符的宽度。
ios字体规范
ios字体规范iOS字体规范指的是在iOS开发中使用字体时的一些规范和建议。
以下是关于iOS字体规范的一些常见准则:1. 使用系统字体:iOS系统提供了一系列的系统字体,如San Francisco和Helvetica Neue。
推荐使用系统字体,可以确保应用在不同iOS设备上的一致性。
2. 字体大小:在iOS开发中,推荐使用动态字体大小。
动态字体大小可以根据用户偏好设置自动调整大小,以保证良好的可读性。
可以使用`UIFontMetrics`类来动态调整字体大小。
3. 字体风格:iOS系统提供了一些字体风格,如粗体和斜体。
根据需要选择适当的字体风格,确保字体在不同大小和样式下的表现一致。
4. 字体颜色:选择合适的字体颜色是确保内容易读的重要因素。
一般来说,应该选择与背景色形成足够对比度的字体颜色。
可以使用系统提供的动态文本颜色(如`labelColor`和`secondaryLabelColor`)来确保在不同模式下字体颜色的合适对比度。
5. 字体间距:字体间距对于可读性也很关键。
iOS系统提供了一些字体间距选项,如默认、紧凑和宽松。
根据需要选择合适的字体间距,确保文字之间的间距不会太小或太大,从而影响可读性。
6. 避免特殊字体效果:在iOS开发中,应避免使用特殊的字体效果,如阴影或描边。
这些效果可能会降低可读性,并使字体在不同设备和尺寸上表现不一致。
7. 字体一致性:在应用中保持字体的一致性非常重要。
应该在所有界面和屏幕上使用相同的字体,以确保用户在导航和浏览过程中能够轻松识别和理解内容。
8. 多语言支持:iOS系统支持多语言,因此在开发中应特别注意字体的多语言支持。
某些语言可能需要特定的字体或字体大小来确保适当的呈现。
总结起来,iOS字体规范强调使用系统字体、动态字体大小、适当的字体风格和颜色,避免特殊字体效果,保持字体的一致性,并特别关注字体的多语言支持。
这些准则可以帮助开发者创建出在不同设备和尺寸上表现一致且易读的应用。
Android获取文字高度的三种方法
Android获取⽂字⾼度的三种⽅法前⾔本⽂是对获取⽂字⾼度整理和总结,参考资料源⾃ statcoverflow的⼀个回答。
具体参看下⾯的参考链接获取⽂字⾼度的三个⽅法paint.getTextBounds(String text, int start, int end, Rect bounds)paint.getFontMetrics()StaticLayout1 paint.getTextBounds(String text, int start, int end, Rect bounds)参数解释text : 被测量的⽂字start: 被测量⽂字的起始位置end: 被测量⽂字的终⽌位置,最⼤为⽂字的长度rounds: 被测量⽂字功能解释如果我们想要获取⼀段string的精确⾼度,我们可以通过 paint.getTextBounds()⽅法来实现。
精确⾼度是指什么?举例来说,下⾯的 Happy new year 这⼏个⽂字中,三个单词的⾼度是不同的。
⾼度等于最上⾯⼀个像素减去最下⾯⼀个像素的⾼度。
所以,三者的⾼度是不同的。
如何获取这三个⾼度呢?就是通过 paint.getTextBounds()⽅法。
String temp = "Happy"; //被获取的⽂字Rect rect = new Rect();Paint paint = new Paint();paint.getTextBounds(temp, 0, temp.length(), rect);int height = rect.height();得到的height 就是我们⽬标⽂字的最终⾼度。
但是需要注意的是,上⾯的到的Happy, new, year 这三个单词的⾼度是不同的。
如果我们想将上⾯三个单词处理成同⼀个⾼度,该怎么办呢?2 paint.getFontMetrics()功能解释paint.getFontMetrics() 帮助我们获取⼀段⽂字中字体的⾼度,注意这⾥说的是字体。
JAVA中BufferedImage、ImageIO用法
JAVA中BufferedImage、ImageIO⽤法JAVA中 BufferedImage、ImageIO⽤法BufferedImageBufferedImage是其Image抽象类的实现类,是⼀个带缓冲区图像类,主要作⽤是将⼀幅图⽚加载到内存中(BufferedImage⽣成的图⽚在内存⾥有⼀个图像缓冲区,利⽤这个缓冲区我们可以很⽅便地操作这个图⽚),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常⽤来做图⽚⼤⼩变换、图⽚变灰、设置透明不透明等。
Java将⼀幅图⽚输⼊输出:// 将图⽚读⼊内存String imgPath = "C://demo.jpg";BufferedImage image = ImageIO.read( new FileInputStream(imgPath) );// 保存图⽚File outputfile = new File("save.png");ImageIO.write(bufferedImage, "png", outputfile); 创建BufferedImage对象://指定宽⾼、创建带灰⾊的对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);//创建⼀个不带透明⾊的对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建⼀个带透明⾊的对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);BufferedImage 与 byte[] 数组的转换BufferedImage –> byte[]/*** format:图⽚格式,“gif"等;* 如果⽬标为byte数组,则将其预设为ByteArrayOutputStream即可传⼊此⽅法,执⾏完后,只要toByteArray()即可获得byte[] */ImageIO.write(BufferedImage image, String format, OutputStream out);byte[] –> bufferedImageByteArrayInputStream in = new ByteArrayInputStream(byte[] b);BufferedImage image = ImageIO.read(InputStream in);BufferedImage 功能介绍BufferedImage bufferedImage = ImageIO.read(new File("c:\\test.jpg"));// 获取图⽚的宽⾼bufferedImage.getWidth();bufferedImage.getHeight();// 图⽚裁剪bufferedImage.getSubimage(0, 0, 10, 10);// 创建画笔对象Graphics2D graphics = bufferedImage.createGraphics();Graphics2D类提供强⼤的绘图能⼒。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int verticalTextPosition,
int horizontalTextPosition,
FontMetrics
Component.AccessibleAWTComponent.getFontMetrics(Font f)
获得此对象的 FontMetrics。
FontMetrics
DebugGraphics.getFontMetrics()
重写 Graphics.getFontMetrics。
FontMetrics
FontMetrics
DebugGraphics.getFontMetrics(Font f)
重写 Graphics.getFontMetrics。
abstract FontMetrics
Toolkit.getFontMetrics(Font font)
已过时。 从 JDK version 1.2 开始,由 Font 方法 getLineMetrics 取代。
Rectangle viewR,
Rectangle iconR,
Rectangle textR,
int textIconGap)
Rectangle viewR,
Rectangle iconR,
Rectangle textR,
int textIconGap)
获取当前字体的字体规格。
FontMetrics
Component.getFontMetrics(Font font)
获得指定字体的字体规格。
计算并返回图标原点的位置,文本基线的原点的位置,以及复合标签字符串的可能进行了修剪的版本。
static String
youtCompoundLabel(JComponent c,
返回 FontMetrics 的 javax.swing.plaf.basic 中的方法
protected Fontபைடு நூலகம்etrics
BasicTabbedPaneUI.getFontMetrics()
FontMetrics
JTree.AccessibleJTree.AccessibleJTreeNode.getFontMetrics(Font f)
MenuComponent.AccessibleAWTMenuComponent.getFontMetrics(Font f)
获取此对象的 FontMetrics。
FontMetrics
参数类型为 FontMetrics 的 javax.swing.plaf.basic 中的方法
protected int
计算并返回图标原点的位置,文本基线的原点的位置,以及复合标签字符串的可能进行了修剪的版本。
javax.swing.plaf.basic 中 FontMetrics 的使用
List.AccessibleAWTList.AccessibleAWTListChild.getFontMetrics(Font f)
设置此对象的 FontMetrics。
static String
youtCompoundLabel(FontMetrics fm,
String text,
Icon icon,
int verticalAlignment,
获取此对象的 FontMetrics。
javax.swing 中 FontMetrics 的使用
返回 FontMetrics 的 javax.swing 中的方法
javax.swing.plaf.basic
提供了根据基本外观构建的用户界面对象。
javax.swing.plaf.synth
Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。
javax.swing.table
提供用于处理 javax.swing.JTable 的类和接口。
获取此对象的 FontMetrics。
FontMetrics
JList.AccessibleJList.AccessibleJListChild.getFontMetrics(Font f)
类 java.awt.FontMetrics 的使用 (Java 2 Platform SE 5.0)
function windowTitle()
{
parent.document.title="类 java.awt.FontMetrics 的使用 (Java 2 Platform SE 5.0)";
参数类型为 FontMetrics 的 javax.swing 中的方法
static int
puteStringWidth(FontMetrics fm,
String str)
使用具有指定“规格”(大小)的字体计算字符串的宽度。
int horizontalAlignment,