gpt4 book ai didi

java - 为什么我的 BufferedImage 在绘制到 Canvas 时会有所不同?

转载 作者:行者123 更新时间:2023-12-01 22:53:15 26 4
gpt4 key购买 nike

原创

https://drive.google.com/file/d/1B3xxfWkGsMs2_MQ_bUQ8_ALYI0DL-LIo/view?usp=sharing

保存到文件时

https://drive.google.com/file/d/1z5euXupeHmiFebch4A39fVqGukoUiK0p/view?usp=sharing

打印到 Canvas 时

https://drive.google.com/file/d/1VouD-ygf0pPXFFx9Knr4pv44FHMtoqcV/view?usp=sharing

BufferedImage temp = bImg.getSubimage(100, 100, (int)imgWidth - 100, (int)imgHeight - 100);
try{
ImageIO.write(temp, "png", new File("test.png"));
}catch(Exception e){
e.printStackTrace();
}
gc.drawImage(SwingFXUtils.toFXImage(temp, null), 100, 100);

出于某种原因,如果我将图像打印到 Canvas 上,它与将同一图像保存到文件中是不同的。当我将其保存到文件时,它会正确计算子图像,但是当我将其打印到 Canvas 时,它会忽略我给它的 x 和 y 坐标,并使用 (0,0) 作为具有给定宽度的 (x,y) 来获取子图像和高度。

最佳答案

来自documentation of the getSubimage method :

Returns a subimage defined by a specified rectangular region. The returned BufferedImage shares the same data array as the original image.

子图像只是原始图像的一个“窗口”;他们使用相同的像素数据。

SwingFXUtils.toFXImage documentation状态:

Snapshots the specified BufferedImage and stores a copy of its pixels into a JavaFX Image object, creating a new object if needed.

虽然仅复制源图像尺寸中的像素肯定是有意义的,但上面的话并没有完全清楚地表明它不会复制整个像素数据缓冲区,从而忽略了子图像的边界图像。我认为这是一个错误,但我可以看到哪里可能有人认为它不是错误。

同时,您可以通过自己提取子图像来解决此问题:

BufferedImage cropped = new BufferedImage(
(int) imgWidth - 100,
(int) imgHeight - 100,
bImg.getType());

Graphics g = cropped.getGraphics();
g.drawImage(bImg, -100, -100, null);
g.dispose();

gc.drawImage(SwingFXUtils.toFXImage(cropped, null), 100, 100);

关于java - 为什么我的 BufferedImage 在绘制到 Canvas 时会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59427618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com