将 Java BufferedImage User Space 设置为 EMU 单位

Set Java BufferedImage User Space to EMU units

我正在创建并渲染到 BufferedImage。此位图将在完成后写入打印机。我想以 EMU 为单位进行所有绘图。位图将为 600 dpi。所以[0,0]是左上角但是写入[914400,914400]的像素将在位图中位于[600,600]。

如何为此设置用户 Space?我知道它以某种方式使用了转换,但我尝试过的一切都没有奏效(我认为)。

如果您希望图像的大小为 [600,600],但希望写入 [914400,914400] 的像素为 [600,600],那么,在您开始在 Graphics2D 对象上绘制任何内容之前你从这个 BufferedImage 得到, 只需像这样调用它的比例:

    BufferedImage image = new BufferedImage(600, 600, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = (Graphics2D) image.getGraphics();
    g.scale(600/914400d,600/914400d);
    // your drawing code below

请注意,如果您绘制的东西很小(例如只有一个像素),这取决于您的渲染提示设置,如果以此比例绘制,它可能根本不可见。

DPI 代表每英寸点数(又名每英寸像素)。如果某物在 600 dpi 图像中位于 600,600 位置,则它距顶部一英寸,距左侧一英寸。如果您有尺寸为 [914400,914400] 的图像,那么它的大小为 1524x1524 英寸,它将占用 2,3 TERA BYTES 的 RAM 内存,以 3 字节 RGB 格式显示,这不是您想要的吗?

好的,这太简单了。我试图从头开始构建 AffineTransform。我需要做的就是:

/** Emus Per Inch */
public static final int EPI = 914400;

image = new BufferedImage(pixelsWidth, pixelsHeight, BufferedImage.TYPE_INT_ARGB);
graphics = image.createGraphics();

AffineTransform scaleToEmus = AffineTransform.getScaleInstance((float)dpi / (float)IDrawingSurface.EPI, (float)dpi / (float)IDrawingSurface.EPI);
graphics.transform(scaleToEmus);

就是这样。 getScaleInstance() 完成所有繁重的工作(我记得它很简单,我只是不记得是什么了!)

dpi 是位图所需的任何 DPI。