使用 Graphics2D 从文本创建图像

问题描述 投票:0回答:0

我公开了自定义字体和 API。逻辑是根据用户使用自定义字体输入的文本创建图像。

要求:高度固定为16,而宽度将根据用户输入的长度动态变化。

问题:图像已创建,但不知何故与字体不完全匹配。有些像素是乱七八糟的。

代码:

 public AppResponse<TextToImageResponse> createImageFromText(
            CreateImageFromTextRequest request,
            Long userId, String folderKey,
            String name, Boolean internal, Boolean backGroundColor) throws IOException, FontFormatException {

        String text = request.getTextValue();

        ClassPathResource resource = new ClassPathResource("/font/pg-led-16pt.ttf");
        InputStream inputStream = resource.getInputStream();
        Font font = Font.createFont(Font.TRUETYPE_FONT, inputStream).deriveFont(Font.PLAIN, 12f);

        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();

        g2d.setFont(font);
        FontMetrics fm = g2d.getFontMetrics();
        int width = fm.stringWidth(text);
        int height = fm.getHeight();
        g2d.dispose();

        DisplayColor displayColor=request.getDisplayColor();
        Color customColor = new Color(displayColor.getR(), displayColor.getG(), displayColor.getB());

        img = new BufferedImage(width, height, backGroundColor !=null && backGroundColor ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB);
        g2d = img.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
        g2d.setFont(font);
        fm = g2d.getFontMetrics();
        g2d.setColor(customColor);
        g2d.drawString(text, 0, fm.getAscent());
        g2d.dispose();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMddHHmm");
        String fileName = name == null ? ZonedDateTime.now().format(formatter) : name;
        File file = new File(fileName.concat(".png"));

        try {
            BufferedImage resizedImage = resizeImage(img,width,
                    request.getHeight() == null ||  request.getHeight() == 0 ? 16 : request.getHeight(),
                    request.getScaling(), Image.SCALE_DEFAULT);

            System.out.println("Height : " + resizedImage.getHeight());
            ImageIO.write(resizedImage, "png", file);

            String imageName = file.getName();
            String url = null;
            byte[] response = FileUtils.readFileToByteArray(file);

            File ppmFile = null ;

            if (request.getImageType()!=null && request.getImageType().equals(ImageFormat.PPM)){
                ppmFile = ImageUtilities.convertPngToPPM(file,imageName, null, true);
                response = FileUtils.readFileToByteArray(ppmFile);
            }

            if (request.getCreateFile()!= null && request.getCreateFile()){
                String key = folderKey == null ? "s3/customers/"+request.getCustomerId()+"/textpreviews/" : folderKey;

                if (request.getImageType()==null || request.getImageType().toString().equals("") || request.getImageType().equals(ImageFormat.PNG)){
                    url = s3Factory.uploadFile(file, key);
                }

                if (request.getImageType()!=null && request.getImageType().equals(ImageFormat.PPM)){
                    url = s3Factory.uploadFile(ppmFile, key);
                }
            }
            System.out.println("S3 URL : " + url);
            TextToImageResponse finalResponse = new TextToImageResponse();
            finalResponse.setCode(response);
            finalResponse.setHeight(resizedImage.getHeight());
            finalResponse.setWidth(resizedImage.getWidth());
            finalResponse.setS3Url(url);
            file.delete();
            return AppResponse.responseOk("Success", finalResponse);

        } catch (IOException ex) {
            ex.printStackTrace();
            return AppResponse.responseError(400, "Something went wrong while processing the Image");
        }
    }

    public static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight, Integer scale, int scalingProperty) {

        if (scale != null && scale > 1) {
            targetHeight = targetHeight * scale;
            targetWidth = targetWidth * scale;
        }

        Image resultingImage = originalImage.getScaledInstance(targetWidth, targetHeight, scalingProperty);
        BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
        outputImage.getGraphics().drawImage(resultingImage, 0, 0, null);
        return outputImage;
    }

与预期结果的图像对比:

image-processing graphics2d
© www.soinside.com 2019 - 2024. All rights reserved.