gpt4 book ai didi

java - 动画GIF,显示在JPanel上,不是用paint方法截图到文件中,但是JPG和PNG都可以

转载 作者:行者123 更新时间:2023-11-30 06:51:10 25 4
gpt4 key购买 nike

抱歉,无法使用 100% 真实代码。其他类中有很多辅助功能,其中一些不是我的。

我正在制作一部视觉小说 - 只是评论一下我的项目,以便更好地理解。

我有一个带有 JPanel 卡片布局的 JFrame。 gameMainPanel 就是其中之一。我的目标 - 制作一个在拍摄时刻面板不可见的镜头。在一个面板上是我的游戏绘图,在另一个面板上我正在使用游戏中的屏幕截图制作游戏保存文件 - 所以游戏面板在那一刻不可见。它工作正常,但是当我在游戏面板上使用动画 GIF 时 - 它不是屏幕截图,而是所有其他 GUI 组件。

我正在使用如下代码加载动画 GIF 并调整其大小:

ImageIcon imageIcon = new ImageIcon(Engine.getPathString("/resource/character/" + name));
imageIcon.setImage(imageIcon.getImage().getScaledInstance(resizeX, resizeY, Image.SCALE_DEFAULT));
GameWindow.gameCharacterCenter.setIcon(imageIcon); //gameCharacterCenter is a simple JLabel on game panel

Engine.getPathString 是一个小包装器,仅返回带有文件完整路径的字符串。 Engine.getPathString("/example/dummy.txt") 将返回类似于“C:/Javaprojects/Folder with that project/example/dummy.txt”的内容,当然关于完整的正确路径。

有一刻我需要拍摄我的游戏面板,我正在这样做:

screenshot = new File(String.valueOf(Engine.getPathFile("/saves/" + name + ".jpeg")));
BufferedImage bufImage = new BufferedImage(GameWindow.gameMainPanel.getSize().width, GameWindow.gameMainPanel.getSize().height, BufferedImage.TYPE_INT_RGB);
GameWindow.gameMainPanel.paint(bufImage.createGraphics());
try {
screenshot.createNewFile();
ImageIO.write(bufImage, "jpeg", screenshot);
} catch (Exception ex) {
}

该代码正确地截屏了我的 gameMainPanel,及其所有子项 - 游戏菜单、角色、带有文本的标签...但不是角色(如果它们是动画 GIF)。当我使用完全相同的代码加载一个简单的 *.jpg 或 *.png 时 - 它的上限正常。

为什么当我在父级中绘制动画 GIF 的 JLabel 时,它不可见,但当它是 JPG 时,它会像平常一样绘制到 BufferedImage?

抱歉,无法提供项目的完整代码。英语不是我的母语,所以 - 也 - 对此也感到抱歉。

使用 PrintScreen 按钮制作:

/image/n6EcE.jpg

用游戏内方法制作:

/image/zKlgn.jpg

最佳答案

所以,我做了一个快速测试,基本上,我拍摄了一个 PNG 图像和一个动画 gif 图像,我使用 ImageIO 加载两者并尝试保存生成的面板,然后我使用 ImageIcon 加载图像并保存

我的输入...

PNG 图像

PNG Image

GIF 图片

Gif Image

“代码”

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

BufferedImage png = ImageIO.read(...));
BufferedImage gif = ImageIO.read(...);
ImageIcon gifImg = new ImageIcon(...);

TestPane pngPane = new TestPane(png);
TestPane gifPane = new TestPane(gif);
TestPane imgPane = new TestPane(gifImg.getImage());

save(pngPane, "PNGTest.png");
save(gifPane, "gifTest.png");
save(imgPane, "imgGifTest.png");

} catch (IOException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}

public void save(JPanel pane, String to) throws IOException {
pane.setSize(pane.getPreferredSize());
BufferedImage img = new BufferedImage(pane.getWidth(), pane.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
pane.printAll(g2d);
g2d.dispose();

ImageIO.write(img, "png", new File(to));
}

public class TestPane extends JPanel {

private Image img;

public TestPane(Image img) {
this.img = img;
}

@Override
public Dimension getPreferredSize() {
return new Dimension(img.getWidth(this), img.getHeight(this));
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(img, 0, 0, this);
g2d.dispose();
}

}

}

结果...

通过ImageIO的PNG图像

PNG Image via <code>ImageIO</code>

通过 ImageIO 生成的 GIF 图像

GIF Image via <code>ImageIO</code>

通过 ImageIcon 生成的 GIF 图像

GIF Image via <code>ImageIcon</code>

我不想深入了解这一切的方式和原因,不用说,ImageIcon 确实使用后台线程来加载图像并依赖于 ImageObserver code> 支持组件在状态更改时重新绘制,这就是它如何获取动画 GIF 在屏幕上更新,因此,人们可能会猜测我们只是缺少更新通知。

我还没有测试过它,但您可以使用 MediaTracker 来监视 ImageIcon 的状态并等待它加载,但考虑到使用 的简单性code>ImageIO 我会质疑它是否值得。

卡弗特

如果您希望动画 gif 在实时组件上播放,则需要使用 ImageIcon!所以你只能在生成预览时使用这个“作弊”!

关于java - 动画GIF,显示在JPanel上,不是用paint方法截图到文件中,但是JPG和PNG都可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743611/

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