使用 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,您可能别无选择,只能将此信息缓存在某个“覆盖配置”对象中。