一些 GD 库调用的 Java 等价物

标签 java php gd

有一个网站完全用 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
    }

根据您有多少内存,预加载字体并保留它们的池可能会节省一些时间。

关于一些 GD 库调用的 Java 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18643731/

相关文章:

java - Java中如何分割字符串?

php - 使用 last id PDO PHP MySQL 将数据插入到两个表中

php - 如何在 PHP 中自动将 url 转换为超链接?

PHP水印

PHP:如何将 "near white"表示为颜色?

java - 最后一个 block 使用 CipherInputStream/CipherOutputStream 不完整,即使使用填充 AES/CBC/PKCS5Padding

java - OpenJPA 查询执行缓慢

java - 使用 lambda 返回 javax.inject.Provider 的新实例

php - 在 PHP 中解析 Paypal NVP 的最佳方法是什么?

php - 在 PHP 中,imagepng() 接受一个过滤器参数。这些过滤器如何影响函数的输出?