【问题标题】:How to move everything in Graphics2D by x,y coordinates.如何通过 x,y 坐标移动 Graphics2D 中的所有内容。
【发布时间】:2015-06-11 07:15:17
【问题描述】:

我需要通过 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 对象,然后将其沿对角线移动几个像素,但我找不到这样做的方法。

【问题讨论】:

  • 您是否尝试将其绘制到自身上而不是创建临时图像(即使用img.createGraphics().drawImage(img, x, y, null))?无论如何,听起来最好保留原始图像,并在绘制到屏幕时进行翻译。但是很难说你最终想在这里实现什么。 :-)

标签: java image graphics bufferedimage graphics2d


【解决方案1】:

使用翻译时来自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,以块的形式获取和设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多