Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动画GIF,显示在JPanel上,不是用画法在文件中截屏,但JPG和PNG是可以的_Java_Image_Swing_Animation_Screenshot - Fatal编程技术网

Java 动画GIF,显示在JPanel上,不是用画法在文件中截屏,但JPG和PNG是可以的

Java 动画GIF,显示在JPanel上,不是用画法在文件中截屏,但JPG和PNG是可以的,java,image,swing,animation,screenshot,Java,Image,Swing,Animation,Screenshot,无法使用100%真实代码,抱歉。其他类中有很多副函数,其中一些不是我的 我正在写一本视觉小说——只是为了更好地理解我的项目 我有一个JFrame和JPanels的卡片布局。gameMainPanel就是其中之一。我的目标-在拍摄瞬间拍摄一张不可见的照片。在一个面板上是我的游戏图纸,在另一个面板上,我正在制作游戏保存文件,其中包含游戏中某一时刻的屏幕截图,所以此时游戏面板不可见。它工作正常,但当我在游戏面板上使用动画GIF时,它不是截屏,而是其他GUI组件所做的 我正在加载动画GIF并调整其大小,

无法使用100%真实代码,抱歉。其他类中有很多副函数,其中一些不是我的

我正在写一本视觉小说——只是为了更好地理解我的项目

我有一个JFrame和JPanels的卡片布局。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
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) {
}
getPathString是一个小包装器,只返回一个包含文件完整路径的字符串。getPathString(“/example/dummy.txt”)将返回类似于“C:/Java projects/Folder with the project/example/dummy.txt”的内容,当然是关于完整正确的路径

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

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
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) {
}
这段代码正确地截屏了我的游戏主面板,包括所有的儿童-游戏菜单、角色、带有文本的标签。。。但如果角色是动画GIF,则不是。当我用完全相同的代码加载一个简单的*.jpg或*.png时,它的封顶是可以的

为什么JLabel在画它的父级时,它中带有动画GIF的效果是不可见的,但是当它是JPG时,它的绘制是以缓冲区的方式正常地进行

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

使用PrintScreen按钮制作:

使用ingame方法制作:


所以,我做了一个快速测试,基本上,我拿了一个PNG图像一个动画gif图像,我用
ImageIO
加载这两个图像并试图保存结果面板,然后我用
ImageIcon
加载图像并保存它

我的意见

PNG图像

GIF图像

“守则” 结果。。。 PNG图像通过
ImageIO

GIF图像通过
ImageIO

GIF图像通过
ImageIcon

我不想讨论这一切的方式和原因,不用说,
ImageIcon
确实使用了一个背景线程来加载图像,并且依靠组件的
ImageObserver
支持在其状态改变时重新绘制,这就是它如何在屏幕上更新动画GIF的方式,因此,有人可能会猜测我们只是错过了更新通知

我没有对它进行测试,但您可以使用
MediaTracker
来监视
ImageIcon
的状态并等待它加载,但考虑到使用
ImageIO
的简单性,我怀疑它是否值得

卡弗特
如果希望在活动组件上播放动画gif,则需要使用
ImageIcon
!因此,您只能在生成预览时使用此“作弊”

A在这里肯定会有帮助。这就是说,Swing组件的绘制是高度优化的,因此您可能希望尝试使用该方法而不是绘制。尝试使用打印方法而不是绘制-相同的结果。对不起,稍后将添加MCV示例(以自解释程序的形式),现在不能做它。对于@ VGR建议的MCVE,考虑使用热链接图像。还可以尝试使用
机器人
获取感兴趣组件的屏幕截图。因为它还没有在屏幕上实现,所以“可能”gif不会被绘制(因为绘制引擎的开销和管道)。一个“可能”的解决方案是使用ImageIO加载gif而不是ImageIcon,只对快照执行此操作,因为它只加载第一个frameMadProgrammer,听起来不错!我想我现在会使用这个小作弊,它对处理时间来说并不难,用户在保存和自动筛选时看不到这个作弊。很抱歉,无法将评论标记为答案。你做得很好!但我不是在图像加载时拍摄的,而是在加载后1-5-10秒拍摄的,所以我不认为什么“MediaTracker”能帮我做到这一点。或者你的意思是在屏幕截图中间的某个地方使用它,而不是“加载它,我们现在就可以开始”了吗?“卡维特”的部分是什么?我的GIF在屏幕上工作,它们是可想象的和动画的。对不起,误读了所有内容。你的回答是正确的,只有我一个人。我会用那个骗局。标记你的答案。