如何通过x,y坐标移动Graphics2D中的所有内容。

时间:2015-06-10 20:30:49

标签: java image graphics bufferedimage graphics2d

我需要通过x,y坐标移动已经制作的BufferedImage,然后使用Graphics2D对象在其上绘制另一个东西。我尝试使用此代码来执行此操作:

Graphics2D g = img.createGraphics();
g.translate(x, y);  

但它不起作用。有没有办法在Graphics2D对象中移动所有内容然后在其上绘制,或者我必须使用此代码来执行此操作:

BufferedImage temp = new BufferedImage(img.getWidth(),img.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2D g = temp.createGraphics();
g.drawImage(img,x, y,null);

使用此代码然后仅绘制少量元素而不是从头开始制作整个图像并不是性能上的大跃进所以我认为制作新的BufferedImage然后在其上绘制图像并不是最好的方法。我宁愿只从已经制作的图像创建Graphics2D对象,然后只是沿对角线移动几个像素,但我找不到这样做的方法。

1 个答案:

答案 0 :(得分:0)

使用翻译时来自Graphics2d docs

  

此图形上下文中后续渲染操作中使用的所有坐标都与此新原点相关。

您正在定义影响未来运营的转型。在调用translate之后,如果要在draw3DRect(0, 0, ... snipped ... )等图形上调用方法,则起始坐标0,0将由x,y转换。

我认为你最好的选择可能是在获得图形对象之前使用BufferedImage的方法移动所有像素。您有getRgbsetRgb

移动像素的一个简单例子:

BufferedImage buffImg = ImageIO.read(img);
int width = buffImg.getWidth();
int horizontalOffset = 10;
int verticalOffset = 10;
int widthToMove = width - horizontalOffset;
int heightToMove = buffImg.getHeight() - verticalOffset;
int[] rgb = buffImg.getRGB(0, 0, widthToMove, heightToMove, null, 0, widthToMove);
buffImg.setRGB(horizontalOffset,verticalOffset,widthToMove, heightToMove,rgb, 0, widthToMove);

这仍然需要你做一些工作,因为在顶部和左边有一条需要填充背景颜色的条带。

如果要在大图像上使用它,你可能想要使用缓冲区int []并将它传递给循环中的getRGB,获取并设置为块。