我正在创建并渲染到BufferedImage。该位图将在完成后写入打印机。我想用EMU作为单位进行所有绘图。位图将为600 dpi。所以[0,0]是左上角,但写入[914400,914400]的像素,位图中的[600,600]。
如何为此设置用户空间?我知道它以某种方式使用了变换,但是我尝试过的所有东西都没有用(我想)。
答案 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。