我公开了自定义字体和 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;
}
与预期结果的图像对比: