有一个完全用PHP开发的网站,带有GD库,主要处理在随机图像上打印文本。
文本必须以大约 100 种规定的 TTF 字体(驻留在.php文件附近的目录中)中的任何一种以十几种规定的颜色打印,并且需要根据几种规定的算法中的任何一种指定文本的位置。
这是通过使用 imagettfbox() 来解决的,它返回文本的几何形状,然后使用 imagettftext() 将其映射到图像上。
我可以在Java中使用什么来实现与servlet/bean相同的功能?我可以将 TTF 字体放在任何我必须的地方。在Windows中注册它们是不可取的,但如果这是唯一的选择,我们会选择它(目前它们不是)。
@LexLythius:
从您的链接和其他一些资源中,我拼凑出了一个在图形上绘制文本的工作解决方案:
// file is pointed at the image
BufferedImage loadedImage = ImageIO.read(file);
// file is pointed at the TTF font
Font font = Font.createFont(Font.TRUETYPE_FONT, file);
Font drawFont = font.deriveFont(20); // use actual size in real life
Graphics graphics = loadedImage.getGraphics();
FontMetrics metrics = graphics.getFontMetrics(drawFont);
Dimension size = new Dimension(metrics.getHeight(), metrics.stringWidth("Hello, world!"));
graphics.setFont(drawFont);
graphics.setColor(new Color(128, 128, 128); // use actual RGB values in real life
graphics.drawString("Hello, world!", 10,10); // use Dimension to calculate position in real life
剩下的就是在 servlet 中显示该图像,并决定哪些功能去哪里 - 到 servlet 或 bean。
您可以从 servlet 响应中获取 OutputStream,并将该 OutputStream 传递给 ImageIO.write。 基于此处代码的示例(不是我的代码):http://www.avajava.com/tutorials/lessons/how-do-i-return-an-image-from-a-servlet-using-imageio.html
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg"); // change this if you are returning PNG
File f = new File( /* path to your file */ );
BufferedImage bi = ImageIO.read(f);
// INSERT YOUR IMAGE MANIPULATION HERE
OutputStream out = response.getOutputStream();
ImageIO.write(bi, "jpg", out); // or "png" if you prefer
out.close(); // may not be necessary; containers should do this for you
}
根据您拥有的内存量,预加载字体并保留字体池可能会节省一些时间。