- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题不是关于如何使用 Java2D 旋转文本;我知道该怎么做。我不知道的是如何使旋转后的文字“看起来不错”。例如,如果您在 PowerPoint 中创建一个文本框并旋转它,无论旋转角度如何,文本都会显得清晰锐利。但是,使用 g2D.drawString()
绘制的文本在 0 度或 90 度时看起来不错,但在其他角度时不太好。有没有办法操纵文本来清理或锐化它?如果是这样,那么如果有人可以指出我在哪里可以学习如何做到这一点,我将非常感激。
下面是一个小程序,说明了我在说什么。旋转时较大的字体还不错,但看起来仍然不是很专业。旋转时较小的字体很糟糕。
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class RotateTest extends JPanel {
String message = "How does this text look?";
public RotateTest() {
this.setPreferredSize(new Dimension(640, 280));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2D.setFont(new Font("MyriadPro", Font.BOLD, 20));
g2D.drawString(message, 80, 20);
AffineTransform orig = g2D.getTransform();
double angle = Math.toRadians(7.0);
g2D.rotate(-angle, -10, 80);
g2D.drawString(message, 80, 80);
g2D.setTransform(orig);
angle = Math.toRadians(30.0);
g2D.rotate(-angle, -40, 80);
g2D.drawString(message, 60, 260);
g2D.setTransform(orig);
g2D.setFont(new Font("MyriadPro", Font.BOLD, 12));
g2D.drawString(message, 380, 20);
angle = Math.toRadians(7.0);
g2D.rotate(-angle, -10, 80);
g2D.drawString(message, 380, 120);
g2D.setTransform(orig);
angle = Math.toRadians(30.0);
g2D.rotate(-angle, -40, 80);
g2D.drawString(message, 320, 400);
g2D.setTransform(orig);
}
private void display() {
JFrame f = new JFrame("RotateTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new RotateTest().display();
}
});
}
}
最佳答案
我曾经遇到过类似的问题,通过将文本高精度绘制到图像上,然后绘制旋转图像来解决它。
这是代码:
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class RotatedText extends JPanel {
String message = "How does this text look?";
public RotatedText() {
this.setPreferredSize(new Dimension(640, 280));
}
public BufferedImage createStringImage(Graphics g, String s) {
int w = g.getFontMetrics().stringWidth(s) + 5;
int h = g.getFontMetrics().getHeight();
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D imageGraphics = image.createGraphics();
imageGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
imageGraphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
imageGraphics.setColor(Color.BLACK);
imageGraphics.setFont(g.getFont());
imageGraphics.drawString(s, 0, h - g.getFontMetrics().getDescent());
imageGraphics.dispose();
return image;
}
private void drawString(Graphics g, String s, int tx, int ty, double theta, double rotx, double roty) {
AffineTransform aff = AffineTransform.getRotateInstance(theta, rotx, roty);
aff.translate(tx, ty);
Graphics2D g2D = ((Graphics2D) g);
g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2D.drawImage(createStringImage(g, s), aff, this);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font("MyriadPro", Font.BOLD, 20));
drawString(g, message, 80, 20, 0, 0, 0);
drawString(g, message, 80, 80, -Math.toRadians(7.0), -10, 80);
drawString(g, message, 60, 260, -Math.toRadians(30.0), -40, 80);
g.setFont(new Font("MyriadPro", Font.BOLD, 12));
drawString(g, message, 380, 20, 0, 0, 0);
drawString(g, message, 380, 120, -Math.toRadians(7.0), -10, 80);
drawString(g, message, 320, 400, -Math.toRadians(30.0), -40, 80);
}
private void display() {
JFrame f = new JFrame("RotateTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new RotatedText().display();
}
});
}
}
关于text - 如何使用 Java2D 使旋转文本看起来不错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388118/
我认为,像Rails这样的框架鼓励从数据库中移出很多逻辑,甚至包括约束和外键之类的东西。更好,因为它更易于管理且易于更改。即使这样,某些操作也更容易更快,或者仅在SQL中才可能。 最近,NoSQL数据
我理解 F1-measure 是精确率和召回率的调和平均值。但是什么值定义了 F1 度量的好坏呢?我似乎找不到任何引用文献(谷歌或学术)来回答我的问题。 最佳答案 考虑sklearn.dummy.Du
我真的被 .NET 4 中引入的代码契约所吸引(尽管有 DevLabs 的帮助)。但是一张精美的打印品让我冷静了很多。这是它说的: 在线程安全方法中在锁外调用后置条件时,除了不使用它们外,目前没有解决
我有一个 GUI 应用程序,它使用 pthreads 进行一些繁重的后台处理。 虽然后台处理正在运行,但 GUI 非常没有响应,我认为这是因为后台线程正在耗尽 CPU 时间。 在 Windows 上,
我是一名优秀的程序员,十分优秀!