【问题标题】:Java - Appending to Buffered image via createGraphics is not workingJava - 通过 createGraphics 附加到缓冲图像不起作用
【发布时间】:2022-06-29 01:17:21
【问题描述】:

我显然在这里遗漏了一些东西。我正在尝试从原始图像中切出一个切片,将剩余的较大部分移到左侧,然后将切出的切片附加到右侧。选框样式。

在附加图像中,原始图像位于顶部,而 drawImage 函数生成的 BufferedImage 位于底部。

这行得通:

    try {
        originalImage = ImageIO.read(new File("c:\\temp\\scanner.png"));

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    int sliceSize = 23;
    scrolledImage = new BufferedImage(originalImage.getWidth(),originalImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = scrolledImage.createGraphics();

    leftSlice = new BufferedImage(originalImage.getWidth(),originalImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
    leftSlice = originalImage.getSubimage(0,0,sliceSize,originalImage.getHeight());
    g2.drawImage(leftSlice,originalImage.getWidth()  - sliceSize,0,sliceSize,originalImage.getHeight(),null);
    rightSlice = new BufferedImage(originalImage.getWidth(),originalImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
    rightSlice = originalImage.getSubimage(sliceSize,0,originalImage.getWidth() - sliceSize,originalImage.getHeight());
    g2.drawImage(rightSlice,0,0,originalImage.getWidth() - sliceSize,originalImage.getHeight(),null);
    g2.dispose();

尝试使用右切片附加到左切片不起作用:

    leftSlice = new BufferedImage(originalImage.getWidth(),originalImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
    leftSlice = originalImage.getSubimage(0,0,sliceSize,originalImage.getHeight());
    Graphics2D left2D = leftSlice.createGraphics();
    rightSlice = new BufferedImage(originalImage.getWidth(),originalImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
    rightSlice = originalImage.getSubimage(sliceSize,0,originalImage.getWidth() - sliceSize,originalImage.getHeight());
    left2D.drawImage(rightSlice,0,0,originalImage.getWidth() - sliceSize,originalImage.getHeight(),null);
    left2D.dispose();

这是我使用第二个代码得到的:

所以..它似乎覆盖了原始图像。当我隐式创建一个新的 BufferedImage(和 createGraphics)然后指示它重写新的时,这怎么可能呢?我怀疑关于 getSubimage 的一些事情......

我只是想消除对额外步骤和缓冲图像的需求,因为此代码将在许多地方用于小型动画元素。

【问题讨论】:

    标签: java awt bufferedimage


    【解决方案1】:

    getSubimage() 共享相同的图像不会创建新图像 - 如果您阅读了文档。

    所以在使用 getSubimage() 时要非常小心。

    这很浪费(因为我们正在谈论这种详细程度):

    leftSlice = new BufferedImage(originalImage.getWidth(),originalImage.getHeight(),BufferedImage.TYPE_INT_ARGB);
    leftSlice = originalImage.getSubimage(0,0,sliceSize,originalImage.getHeight());
    

    通过构造函数创建一个图像,然后用其他东西覆盖该地址。但如果您不关心空间和正确性,这没什么大不了的。

    getSubimage() 如您所见,会影响您的正确性..

    【讨论】:

    • 谢谢。我没有单击该方法以查看所有详细信息。该方法的概述没有提到这个事实。不过,我觉得这有点奇怪。如果您立即更改指向原始图像的指针,那么创建的新 BufferedImage 会发生什么情况?我将其更改为使用滚动图像,然后使用 rightSlice 绘制图像,然后使用 leftSlice。工作正常。
    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2016-12-13
    • 2021-10-10
    • 2016-02-29
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多