[英]off screen graphics resolution in java.awt
我有一些Java代碼,需要以編程方式將文本渲染到圖像上。 因此,我使用BufferedImage,並在Graphics對象上寫文本。
但是,在配置字體實例時,將以磅為單位指定字體大小。 將一段文本渲染到圖像上時,AWT將根據Graphics對象的分辨率將這些點轉換為像素。 我不想讓自己參與像素/點比率的計算,因為這實際上是AWT的任務。 生成的圖像適用於高分辨率設備(高於任何台式機顯示器)。
但是,我似乎沒有找到指定圖形分辨率的方法。 它是從本地圖形環境繼承的,這是我無法控制的。 我真的不希望此代碼依賴於任何本地代碼,而且甚至不確定使用本地圖形環境確定屏幕外柵格的分辨率是否“明智”,后者知道人們想要它們的作用。
因此,可以通過任何方式為任何類型的屏幕外圖像指定分辨率(最好是可以創建Graphics對象以便可以使用標准AWT渲染API的分辨率)?
(更新)這是一個(相當長的)樣本問題,該問題以預定的字體大小(以像素為單位)在圖像上渲染一段文本(有效,目標設備的DPI為72)。 讓我感到煩惱的是,盡管我沒有以任何方式使用屏幕,但我必須使用本地屏幕DPI來計算字體大小(以磅為單位),因此這無關緊要,並且在無頭系統上全部失敗。 在這種情況下,我更喜歡的是能夠創建DPI為72的屏幕外圖像(圖形,光柵),這將使點的值等於像素。
運行代碼的示例方法:
$ java FontDisplay Monospace 150 "Cat in a bag" 1.png
這將在150像素高的圖像上呈現字體大小為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();
}
}
將像素 點與像素進行比較,就像從公斤到牛頓 ,加速度可能會帶來不同的轉換。 AWT使您可以選擇設備(屏幕,打印機),但是在您的情況下,您必須確定比例。
您當然可以使用Photoshop或Gimp並為Java創建標准圖像。
經過闡述的問題:
嗯,我想我誤會了。 圖像只涉及像素,從不涉及點,mm,DPI或其他。 (有時僅作為元信息單獨添加到圖像中。)
因此,如果您知道設備的DPI,要使用的英寸,則點/像素就清晰了。 點/ dpi可能會照亮更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.