Ich habe Probleme mit der Skalierung der Schriftart, um in die Hintergrundbreite zu passen. Ich habe einen Hintergrund mit einer Höhe von 1000 und einer Breite von 350, und ich versuche, die Schrift zu skalieren, wenn sie größer als der Hintergrund ist. Ich habe mehrere Tests mit verschiedenen Schriften gemacht und die Ergebnisse sind gleich, einige Buchstaben fehlen oder Leerzeichen am Ende des Textes.Java Graphics2D Schriftart zum Ausfüllen des Hintergrunds
Dies ist der Code:
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.io.IOException;
import javax.imageio.ImageIO;
public class PruebaStackoverflow {
public static void main(String[] args) {
String titleText = null;
Graphics2D g2D = null;
Font testFont = null;
File imageGrayBackgroundFile = new File(
"resources/pruebaAltaResolucionGris.png");
File destinationImageGray = new File("resources/outputTextGray.png");
BufferedImage background = readImage(imageGrayBackgroundFile);
titleText = "Lorem ipsum dolor sit amet asdkf sdm";
testFont = new Font("Lucida Console", Font.PLAIN, 50);
g2D = background.createGraphics();
g2D.setColor(Color.BLACK);
g2D.setFont(testFont);
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2D = scaleFontFromFontMetrics(g2D, background, titleText);
g2D.drawString(titleText, 0, 150);
g2D.dispose();
writeImage(destinationImageGray, background);
}
private static Graphics2D scaleFontFromFontMetrics(Graphics2D g2D,
BufferedImage backgroundImage, String text) {
double xScale;
double yScale;
double scale;
Integer backgroundWidth = null;
Integer backgroundHeight = null;
Integer textWidth = null;
Integer textHeigth = null;
backgroundWidth = backgroundImage.getWidth();
backgroundHeight = backgroundImage.getHeight();
Font f = g2D.getFont();
FontMetrics fm = g2D.getFontMetrics(f);
textWidth = fm.stringWidth(text);
textHeigth = fm.getHeight();
xScale = backgroundWidth/(double) textWidth;
yScale = backgroundHeight/(double) textHeigth;
if (xScale > yScale) {
scale = yScale;
} else {
scale = xScale;
}
g2D.setFont(f.deriveFont(AffineTransform.getScaleInstance(scale, scale)));
return g2D;
}
private static BufferedImage readImage(File sourceImage) {
BufferedImage bufferedImage = null;
try {
bufferedImage = ImageIO.read(sourceImage);
} catch (IOException e1) {
e1.printStackTrace();
}
return bufferedImage;
}
private static void writeImage(File destinationImage,
BufferedImage bufferedImage) {
try {
ImageIO.write(bufferedImage, "png", destinationImage);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Image Saved");
}
}
dies ist der Text "Lorem ipsum dolor sit amet asdkf sdm" und dies wird Text skaliert mit affiner Transformation zu skalieren.
output image with font scaled and 'm' letter missed
Ich hoffe, dass Sie mir helfen können, dank
Der Grund dafür, dass es so verhält, wie es ist, liegt daran, dass es die engste Schriftgröße zur Breite auswählt. In diesem Fall wird 14pt statt 13pt, aber 13pt nicht die gesamte Breite "füllen". Möglicherweise müssen Sie versuchen, ein Bild mit dem Text zu erstellen und dann das Bild zu skalieren. –