簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM