使用 java 获取图像的字体名称和颜色
Get font name and color of an image using java
我目前正在 运行 自动化 UI 测试,部分检查是为了确保背景颜色、字体颜色和使用的字体系列在整个应用程序中保持一致。该代码拍摄屏幕或元素的快照并检查背景颜色,但我无法检查字体系列和字体颜色。我有一个代码来检查背景颜色,效果很好。有没有办法获得字体系列和颜色?有没有 Java 库可以做到这一点?
我附上了示例图片。图像背景颜色为白色,由下面的代码检测到。
此代码检查背景颜色
public void checkBackgroundColor(String mobileElement, String saveReadFile, String hexValue) throws IOException {
MobileElement elem = (MobileElement) getMobileDriver().findElement(By.xpath(mobileElement));
File scrFile = elem.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File(saveReadFile));
File savedFile = new File(saveReadFile);
BufferedImage image = ImageIO.read( savedFile);
org.openqa.selenium.Point point = elem.getCenter();
org.openqa.selenium.Point location = elem.getLocation();
Dimension size = elem.getSize();
MyLogger.info("Point X is " + point.getX() +" Point Y is " + point.getY());
MyLogger.info("Location X is " + location.getX() +" Location Y is " + location.getY());
MyLogger.info("Size Height is " + size.getHeight() +" Size width is " + size.getWidth());
// Getting pixel color by position x and y
int h = (int) Math.round(size.getWidth() * 0.2);
int w = (int) Math.round(size.getHeight() * 0.8);
int clr= image.getRGB(h , w);
int r = (clr & 0x00ff0000) >> 16;
int g = (clr & 0x0000ff00) >> 8;
int b = clr & 0x000000ff;
String hex = String.format("#%02x%02x%02x", r, g, b);
if (hex.equalsIgnoreCase(hexValue)){
MyLogger.info("Actual value "+ hexValue +" of " +buttons+savedFile.getName() +" is equals to the expected value " +hex);
} else {
MyLogger.info("Actual value "+ hexValue +" of " +buttons+savedFile.getName() +" is is not equals to the expected value " +hex);
}
}
你可以试试这个
Graphics g = image.getGraphics(); //using the BufferedImage from your example
System.out.println(g.getFont().getFamily()); // For me, it displays "Dialog" which is one of the logical fonts according to https://docs.oracle.com/javase/tutorial/2d/text/fonts.html
g.dispose();
更新:
image.getGraphics()
不会 return 用于创建叠加层的 Graphics2D
对象。它实际上创建了一个新的图形对象并 returns 它。 Graphics2D
的两个子类实际上包含一个显然包含此信息的委托对象。不幸的是,Graphics2D
的这些子类在现在受限制的 sun
包中。因此,此信息似乎无法访问。如果您需要用于覆盖的 Font
,您可能别无选择,只能将此信息缓存在某个“覆盖配置”对象中。
我目前正在 运行 自动化 UI 测试,部分检查是为了确保背景颜色、字体颜色和使用的字体系列在整个应用程序中保持一致。该代码拍摄屏幕或元素的快照并检查背景颜色,但我无法检查字体系列和字体颜色。我有一个代码来检查背景颜色,效果很好。有没有办法获得字体系列和颜色?有没有 Java 库可以做到这一点?
我附上了示例图片。图像背景颜色为白色,由下面的代码检测到。
此代码检查背景颜色
public void checkBackgroundColor(String mobileElement, String saveReadFile, String hexValue) throws IOException {
MobileElement elem = (MobileElement) getMobileDriver().findElement(By.xpath(mobileElement));
File scrFile = elem.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File(saveReadFile));
File savedFile = new File(saveReadFile);
BufferedImage image = ImageIO.read( savedFile);
org.openqa.selenium.Point point = elem.getCenter();
org.openqa.selenium.Point location = elem.getLocation();
Dimension size = elem.getSize();
MyLogger.info("Point X is " + point.getX() +" Point Y is " + point.getY());
MyLogger.info("Location X is " + location.getX() +" Location Y is " + location.getY());
MyLogger.info("Size Height is " + size.getHeight() +" Size width is " + size.getWidth());
// Getting pixel color by position x and y
int h = (int) Math.round(size.getWidth() * 0.2);
int w = (int) Math.round(size.getHeight() * 0.8);
int clr= image.getRGB(h , w);
int r = (clr & 0x00ff0000) >> 16;
int g = (clr & 0x0000ff00) >> 8;
int b = clr & 0x000000ff;
String hex = String.format("#%02x%02x%02x", r, g, b);
if (hex.equalsIgnoreCase(hexValue)){
MyLogger.info("Actual value "+ hexValue +" of " +buttons+savedFile.getName() +" is equals to the expected value " +hex);
} else {
MyLogger.info("Actual value "+ hexValue +" of " +buttons+savedFile.getName() +" is is not equals to the expected value " +hex);
}
}
你可以试试这个
Graphics g = image.getGraphics(); //using the BufferedImage from your example
System.out.println(g.getFont().getFamily()); // For me, it displays "Dialog" which is one of the logical fonts according to https://docs.oracle.com/javase/tutorial/2d/text/fonts.html
g.dispose();
更新:
image.getGraphics()
不会 return 用于创建叠加层的 Graphics2D
对象。它实际上创建了一个新的图形对象并 returns 它。 Graphics2D
的两个子类实际上包含一个显然包含此信息的委托对象。不幸的是,Graphics2D
的这些子类在现在受限制的 sun
包中。因此,此信息似乎无法访问。如果您需要用于覆盖的 Font
,您可能别无选择,只能将此信息缓存在某个“覆盖配置”对象中。