【问题标题】:Scale String in Java to fit rectangle from inside在 Java 中缩放字符串以从内部适应矩形
【发布时间】:2012-03-06 18:00:06
【问题描述】:

谁能帮我找到一种方法在 Java (Graphics2D) 中缩放字符串/字符以完全适合给定大小的矩形(使其从内部接触矩形)?

这是我目前所拥有的:

String s = "S"; // always a single character!
Rectangle rect = getRect(); // defines the desired size and position
AffineTransform transform = new AffineTransform();
transform.setToTranslation(rect.getX(), rect.getY());
transform.scale(rect.getWidth() / (double) fm.stringWidth(s), 
                rect.getHeight() / (double) fm.getAscent());
FontRenderContext frc = image.getFontRenderContext();
TextLayout tl = new TextLayout(s, g2d.getFont(), frc);
Shape shape = tl.getOutline(transform);
g2d.setClip(shape);
g2d.fill(shape.getBounds());

问题我运行此代码是,虽然字符串被缩放以大致适合矩形大小,但它并不完全适合它,即。它不会从内部触及矩形边界(这是我想要它做的!)。

使用不同的字体有帮助吗?我目前正在使用等宽字体。 或者,我必须以不同的方式进行缩放吗?

感谢您的帮助!

【问题讨论】:

  • 为什么不用像 Swing 这样的图形框架?
  • 我只是在为 Web 应用程序绘制图像。你知道使用 Swing 的简单解决方案吗?
  • 抱歉,我没有仔细阅读这个问题。我认为您将不得不调整单个字符间距以使其与框的边缘完全接触。
  • 所以你是说我走对了?你知道我是否可以使用 FontMetrics(上面列表中的 fm)来做到这一点,还是有其他方法?
  • 听起来像是这样做的方式。我会为每个单词或字符创建一个对象,并根据它们的大小计算间距。

标签: java transform scale graphics2d scaletransform


【解决方案1】:

我想出了一种方法来做我想做的事,并认为我可以分享它:

我的主要问题是不同字符的高度,所以我没有使用字体的上升,而是使用它的轮廓的最大和最小 Y 坐标来计算它的高度。见下文。

String s = "S"; // always a single character!
Rectangle rect = getRect(); // defines the desired size and position
FontMetrics fm = g2d.getFontMetrics();
FontRenderContext frc = g2d.getFontRenderContext();
TextLayout tl = new TextLayout(s, g2d.getFont(), frc);
AffineTransform transform = new AffineTransform();
transform.setToTranslation(rect.getX(), rect.getY());
double scaleY = 
   rect.getHeight() / (double) (tl.getOutline(null).getBounds().getMaxY() 
                                - tl.getOutline(null).getBounds().getMinY());
transform.scale(rect.getWidth() / (double) fm.stringWidth(s), scaleY);
Shape shape = tl.getOutline(transform);
g2d.setClip(shape);
g2d.fill(shape.getBounds());

希望对遇到类似问题的人有所帮助!

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多