gpt4 book ai didi

Java Graphics2D 缩放字体以填充背景

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:50 24 4
gpt4 key购买 nike

我在缩放字体以适应背景宽度时遇到问题。我有一个 1000 高度和 350 宽度的背景,并且当字体大于背景时我尝试缩放字体。我用不同的字体做了几次测试,结果是相同的,一些字母丢失或文本末尾有空格。

这是代码:

 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");
}

}

这是要缩放的文本“Lorem ipsum dolor sat amet asdkf sdm”这是通过仿射变换缩放的文本。

output image with font scaled and 'm' letter missed

希望您能帮助我,谢谢

最佳答案

您可以测量字符串的长度并验证它是否适合您的内容。

int lengthInPixel = graphics.getFontMetrics().stringWidth("Lorem ipsum dolor sit amet asdkf sdm")

关于Java Graphics2D 缩放字体以填充背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com