gpt4 book ai didi

java - java.awt 中的屏幕外图形分辨率

转载 作者:行者123 更新时间:2023-11-30 11:46:29 26 4
gpt4 key购买 nike

我有一些 java 代码需要以编程方式将文本渲染到图像上。所以我使用 BufferedImage,并在 Graphics 对象上写入文本。

但是,在配置字体实例时,可以指定字体大小(以磅为单位)。当一段文本呈现在图像上时,AWT 将根据 Graphics 对象的分辨率将这些点转换为像素。我不想让自己参与计算像素/点比率,因为这确实是 AWT 的任务。正在生成的图像适用于高分辨率设备(高于任何桌面显示器)。

但是,我似乎找不到指定图形分辨率的方法。它是从本 map 形环境继承而来的,这是我无法控制的。我真的不希望这段代码依赖于任何本地的东西,我什至不确定它是否“正常”,使用本 map 形环境来确定屏幕外光栅的分辨率,谁知道人们想要它们做什么。

那么,我可以通过任何方式为任何类型的屏幕外图像指定分辨率(最好是可以创建 Graphics 对象以便我可以使用标准 AWT 渲染 API 的图像)?

(更新)这是一个(相当长的)示例问题,它在图像上呈现一段文本,以像素 为单位预定义字体大小(实际上,目标设备 DPI 为 72)。让我烦恼的是,我必须使用本地屏幕 DPI 来计算字体大小(以点为单位),尽管我没有以任何方式使用屏幕,所以它不相关,并且在 headless 系统上完全失败。相反,在这种情况下,我希望能够创建一个 DPI 为 72 的屏幕外图像(图形、光栅),这将使点按值等于像素。

运行代码的示例方法:

$ java FontDisplay Monospace 150 "Cat in a bag" 1.png

这将在 150 像素高的图像上渲染“Cat in a bag message”,字体大小为 150 像素,并将结果保存在 1.png 中。

import java.awt.*;
import java.awt.image.*;
import java.awt.font.*;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.io.*;
import java.util.*;

public class FontDisplay {

public static void main(String a[]) throws Exception {

// args: <font_name> <pixel_height> <text> <image_file>
// image file must have supported extension.

int height = Integer.parseInt(a[1]);
String text = a[2];

BufferedImage bi = new BufferedImage(1, 1,
BufferedImage.TYPE_INT_ARGB);

int dpi = Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println("dpi : "+dpi);
float points = (float)height * 72.0F / (float)dpi;
System.out.println("points : "+points);

Map m = new HashMap();
m.put(TextAttribute.FAMILY, a[0]);
m.put(TextAttribute.SIZE, points);

Font f = Font.getFont(m);

if (f == null) {
throw new Exception("Font "+a[0]+" not found on your system");
}

Graphics2D g = bi.createGraphics();

FontMetrics fm = g.getFontMetrics(f);

int w = fm.charsWidth(text.toCharArray(), 0, text.length());

bi = new BufferedImage(w, height, BufferedImage.TYPE_INT_ARGB);

g = bi.createGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, w, height);
g.setColor(Color.WHITE);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g.setFont(f);
g.drawString(text, 0, fm.getMaxAscent());

String fName = a[3];
String ext = fName.substring(fName.lastIndexOf('.')+1).toLowerCase();

File file = new File(fName);
ImageWriter iw = ImageIO.getImageWritersBySuffix(ext).next();

ImageOutputStream ios = ImageIO.createImageOutputStream(file);
iw.setOutput(ios);
iw.write(bi);
ios.flush();
ios.close();

}

}

最佳答案

像素的比较就像kg牛顿的比较,其中加速度可能会产生不同的转换。 AWT 允许您选择设备(屏幕、打印机),但在您的情况下,您肯定必须确定您的比率。

您当然可以使用 Photoshop 或 Gimp 并为 java 创建标准图像。


在详细的问题之后:

啊,我想我看到了误会。图像只涉及像素,从不涉及点、毫米、DPI 或其他任何内容。 (有时仅作为单独添加到图像的元信息。)

因此,如果您知道设备的 DPI,以及要使用的英寸,那么点/像素就很清楚了。 points/dpi可能会发出更多的光。

关于java - java.awt 中的屏幕外图形分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728113/

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