将Java BufferedImage用户空间设置为EMU单元

时间:2015-12-10 20:00:48

标签: java bufferedimage graphics2d

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

如何为此设置用户空间?我知道它以某种方式使用了变换,但是我尝试过的所有东西都没有用(我想)。

2 个答案:

答案 0 :(得分:0)

如果您希望图像的大小为[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英寸大,它将占用3个字节RGB格式的2,3内存字节的RAM内存,这是不是你想要的东西?

答案 1 :(得分:0)

好的,这非常简单。我试图从头开始构建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。