将Java BuffereImage用户空间设置为EMU单位

将Java BuffereImage用户空间设置为EMU单位,java,bufferedimage,graphics2d,Java,Bufferedimage,Graphics2d,我正在创建并渲染一个BuffereImage。此位图将在完成后写入打印机。我想做所有的绘图使用电动车组为单位。位图将为600 dpi。因此[0,0]是左上角,但写入[914400914400]的像素将位于位图中的[600600] 如何为此设置用户空间?我知道它在某种程度上使用了变换,但我尝试过的一切都没有起作用(我想)。如果您希望图像的大小为[600600],但希望写入[914400914400]的像素为[600600],那么,在开始在从该BuffereImage获得的Graphics2D对象上

我正在创建并渲染一个BuffereImage。此位图将在完成后写入打印机。我想做所有的绘图使用电动车组为单位。位图将为600 dpi。因此[0,0]是左上角,但写入[914400914400]的像素将位于位图中的[600600]


如何为此设置用户空间?我知道它在某种程度上使用了变换,但我尝试过的一切都没有起作用(我想)。

如果您希望图像的大小为[600600],但希望写入[914400914400]的像素为[600600],那么,在开始在从该BuffereImage获得的Graphics2D对象上绘制任何内容之前, 只需像这样称一个秤:

    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图像中位于600600位置,则它距离顶部和左侧各一英寸。如果你有大小为[914400914400]的图像,那么它是1524x1524英寸大,它将在3字节RGB fromat中占用2,3 TB的RAM内存,这不是你想要的吗?

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

/** 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。

您首先需要知道的是源图像dpi是什么,因为,一旦您有了此信息,您可以计算图像的大小以满足所需的600dpi输出,这些计算也在冗长的示例中演示。如果从空白图像开始,则需要知道纸张的输出大小(以像素、英寸或cns为单位),从中可以计算dpi(图像宽度/高度),java print api假定dpi为72dpi@MadProgrammer不,我的问题有点不同。没有src位图。我想创建一个BufferImage,然后从中创建一个图形对象。此时,用户空间==位图中的像素。我想改变这一点,让用户空间在EMU中,我将像素视为600 dpi。我很困惑。如果你想用英寸来做你的工作,你的数学不是会倒退吗?如果您将图像放置在(1,1)处,它应该是像素[600600],而不是相反。因此,创建一个600dpi的图像,您的目标输出大小是多少(以英寸为单位),从那里您可以计算您需要的像素数。例如,如果您要打印到A4页,即
21.0cm
x
29.7cm
@600dpi,您可以使用
(21.0*0.393700787)*600
x
(29.7*0.393700787)*600
,它使图像大小为
4960.6299162
x
7015.74802434
像素不,我希望用户空间单位为每英寸914400,而我希望像素为每英寸600。因此,在图形对象[914400914400]处放置一个像素将是[600600]处的像素。@DavidThielen因此,根据声音(如果是),您已经完成了计算