鉴于最近需要合成一些GIF图像,而看到很多GIF制作都需要收费,所以花了些时间,能基本满足自己的需求了,读者可以随意自行复制修改。


效果(这里的图片本来可以达到是14M效果好,但是超过了csdn上传图片文件的大小限制,所以保持了缩放,图片帧也会有点少,只有4.7M,画面有会有点断断续续的,读者可以自己修改一些代码中有关FPS的参数,就会达到流畅的效果… )

相关代码如下:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.wu</groupId><artifactId>Edge</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>com.madgag</groupId><artifactId>animated-gif-lib</artifactId><version>1.4</version></dependency></dependencies>
</project>

GIF.java

package com.wu;import com.madgag.gif.fmsware.AnimatedGifEncoder;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;public class GIF extends JFrame {private Robot robot = null;private int times = 2; // 初始命中次数private Rectangle rectangle = new Rectangle();private BufferedImage[] images = null;private int frames = 0; // 当前帧数private final static int FRAMES = 150; // 最大帧数 只影响总帧数private int framePerMS = 100; // 毫秒每帧 只影响帧捕捉时间间隔private int currentProgress = 0; // 当前进度private String path = null; // 文件路径private FileOutputStream fileOutputStream = null; // 导出文件流private final static String GIFNAME = "MyGif.gif"; // 默认文件名private JTextField text = null;public GIF(){this.setSize(350,110);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("GIF生成");this.setLayout(null);this.images = new BufferedImage[FRAMES];this.setAlwaysOnTop(true);this.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){// System.out.println("这里工作了… ");if(e.getKeyChar() == 's' && times > 0){times--;Point point  = MouseInfo.getPointerInfo().getLocation(); // 获取当前鼠标坐标if(times == 1){rectangle.x = point.x;rectangle.y = point.y;}else if(times == 0){if(point.x > rectangle.x && point.y < rectangle.y){ // 相对与第一个点的第一坐标系内rectangle.height = rectangle.y - point.y;rectangle.y = point.y;rectangle.width = point.x - rectangle.x;}else if(point.x < rectangle.x && point.y < rectangle.y){ // 相对于第一个点的第二坐标系int temp = point.x;point.x = rectangle.x;rectangle.x = temp;temp = point.y;point.y = rectangle.y;rectangle.y = temp;rectangle.width = point.x - rectangle.x;rectangle.height = point.y - rectangle.y;}else if(point.x < rectangle.x && point.y > rectangle.y){ // 相对于第一个点的第三坐标系rectangle.width = rectangle.x - point.x;rectangle.height = point.y - rectangle.y;rectangle.x = point.x;}else{ // 相对于第一个点的第四坐标系rectangle.width = point.x - rectangle.x;rectangle.height = point.y - rectangle.y;}}}}});this.setResizable(false);try{Thread.sleep(100);robot = new Robot();}catch(Exception exception){}JLabel fileName = null;{fileName = new JLabel("导出位置:");this.add(fileName);fileName.setBounds(5,10,83,30);final Font font = new Font("宋体",Font.BOLD,17);fileName.setFont(font);text = new JTextField("\\");this.add(text);text.setToolTipText("GIF文件导出位置");text.setEditable(false); // 初始设置为不可编辑状态text.setForeground(Color.gray);text.setBackground(Color.white);text.setFont(font);text.setBounds(92,10,242,30);{text.addMouseListener(new MouseAdapter() {@Overridepublic void mouseExited(MouseEvent e) {// System.out.println("鼠标退出… ");text.setFocusable(false);text.setEditable(false);try{ // 处理文件位置异常问题path = text.getText();File file = new File(path);if(path.charAt(path.length() - 1) == '\\'){fileOutputStream = new FileOutputStream(file+GIFNAME);}else{fileOutputStream = new FileOutputStream(file+"\\"+GIFNAME);}}catch(Exception exception){JOptionPane jOptionPane = new JOptionPane();JLabel jLabel = new JLabel("导出文件目录错误,并重置矩形区域!");jLabel.setFont(font);/**Component[] components = jOptionPane.getComponents();JPanel jPanel = (JPanel) components[1];JButton jButton = (JButton) jPanel.getComponent(0);jButton.setFont(font);jButton.setBorderPainted(false);jButton.setBorder(BorderFactory.createRaisedBevelBorder());**/jOptionPane.showMessageDialog(null,jLabel,"Error",JOptionPane.WARNING_MESSAGE);times = 2; // 还原text.setText("\\");}}@Overridepublic void mouseClicked(MouseEvent e) {// System.out.println("鼠标点击… ");text.setEditable(true); // 设置为可编辑状态text.setFocusable(true);}});}}int delay = framePerMS; // 监听final JProgressBar progressBar = new JProgressBar();// 设置进度的 最小值 和 最大值progressBar.setMinimum(0);progressBar.setMaximum(100);// 设置当前进度值progressBar.setValue(currentProgress);// 绘制百分比文本(进度条中间显示的百分数)progressBar.setStringPainted(true);progressBar.setBounds(20,50,300,20);this.add(progressBar);this.setVisible(true);ActionListener actionListener = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if(rectangle.x >= 0 && rectangle.y >= 0 && rectangle.width > 0 && rectangle.height > 0 &&frames < FRAMES){try{images[frames++] = robot.createScreenCapture(rectangle);// ImageIO.write(image,"jpg",new File("C:\\Users\\Administrator\\OneDrive\\图片\\1.jpg"));progressBar.setValue(frames*100/FRAMES);}catch(Exception exception){exception.printStackTrace();}}else if(frames >= FRAMES){try{generateGIF();}catch(Exception exception){System.exit(0);}}}};// 启动计时器new Timer(delay,actionListener).start();}/*** 生成GIF*/public void generateGIF() throws Exception{AnimatedGifEncoder animatedGifEncoder = new AnimatedGifEncoder();try{animatedGifEncoder.start(fileOutputStream);animatedGifEncoder.setDelay(framePerMS);animatedGifEncoder.setRepeat(0);for(int i = 0 ; i < FRAMES ; i++){animatedGifEncoder.addFrame(images[i]);}animatedGifEncoder.finish();System.exit(0); // 退出}catch(Exception e){throw e;}}public static void main(String[] args) throws Exception{new GIF();}
}

功能说明:第一次点击's'键确定一个矩形GIF图片角,再次点击's'键确定另一个图片角,然后开始根据该矩形区域截取视频帧,最终等待一会,并把合成的GIF图片保存到自定义目录下,默认文件名为MyGif.gif。

读者有疑问欢迎留言…

Java小项目 屏幕自定义尺寸GIF生成器V1.0相关推荐

  1. java小项目影院系统

    java小项目,影院管理系统 http://download.csdn.net/detail/github_32658299/9632276 下面是两个关键的类 1.这是电影院测试类,用来读取用户输入 ...

  2. java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  3. java小项目家庭记账程序

    文章目录 java小项目家庭记账程序 **1.项目目标:** 2.项目需求: 3.具体思路: 4.具体代码: 1.页面: 2.Option_1类: 3.Option_2类: 4.Option_3类: ...

  4. 我是一只小僵尸java,Java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材...

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  5. Java小项目中WEB-INF下jsp页面如何访问?

    Java小项目中WEB-INF下jsp页面如何访问? - 今天又是充满希望的一天 - CSDN博客 关闭 今天又是充满希望的一天 目录视图 摘要视图 订阅 var username = "H ...

  6. java小项目租车系统_Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...

  7. ​小皮助手(电脑玩手机游戏) v1.0 官方版

    小皮助手(电脑玩手机游戏) v1.0 官方版 软件大小:19.5MB 软件语言:简体中文 软件类别:手机工具 更新时间:2015-01-30 应用平台:/Win8/Win7/WinXP 小皮助手是一款 ...

  8. 小皮助手(电脑玩手机游戏) v1.0.0.1 官方版

    小皮助手(电脑玩手机游戏) v1.0.0.1 官方版 软件大小:19.5MB 软件语言:简体中文 软件类别:手机工具 软件授权:官方版 更新时间:2015-02-03 应用平台:/Win8/Win7/ ...

  9. 小皮助手(电脑玩手机游戏) v1.0.0.2 官方版

    小皮助手(电脑玩手机游戏) v1.0.0.2 官方版 软件大小:19.5MB 软件语言:简体中文 软件类别:手机工具 软件授权:官方版 更新时间:2015-02-08 应用平台:/Win8/Win7/ ...

  10. Java 小项目——字符界面收银台(优化版)

    目录 1. 前言 2. 功能实现 3. 功能分析 4. 模块划分 5. UML图 6. 使用技术 7. 代码 1. 前言 三个月前,我就写过这个项目的低级版.之前是利用数组进行商品的存储,所以存在商品 ...

最新文章

  1. 开始即结束,Meta元宇宙OS要黄?
  2. 计算机理论在实际编程中的应用之我见
  3. Node.js中package.json中库的版本号详解(^和~区别)
  4. 【android】【转】class android.media.MediaPlayer
  5. __declspec(dllimport)
  6. 2014年ENVI/IDL遥感应用与开发培训班-11月重庆站 開始报名了
  7. [程序设计语言] 堆和栈的全面总结
  8. java组件_三个必不可少的Java平台组件:什么是JVM,JDK,JRE?有啥区别?
  9. dynamic的使用
  10. 基本数据类型包装类的使用与转换
  11. java 计算器 junit测试_测试工具之JUnit4 结合Mockito模拟测试代码
  12. 搜狗输入法linux词库导入,Fedora 20下 ibus 导入搜狗词库的正确做法
  13. Vue 下载本地静态资源
  14. 简单博弈(java)
  15. 计算机网络教室验收标准,计算机网络教室建设和配备要求
  16. java 北京时间 东八区时间 Android calendar时区无效问题
  17. Matlab学习3-图像处理之镜像、错切、透视
  18. SpringBoot 打成的 jar 包和普通的 jar 包有什么区别
  19. 《移动应用开发》实验报告——音乐播放器
  20. 从“中产梦”中醒来,好好打工吧

热门文章

  1. python中如何生成项目帮助文档
  2. MFC开发——MFC项目创建
  3. 计算机组成原理(白中英) 第四章 课后题答案
  4. 【吴恩达机器学习】正则化
  5. Java防御目录穿越漏洞方法_WinRAR目录穿越漏洞复现及防御
  6. JAVA窗口——Frame
  7. 媲美Teamviewer的远程桌面软件推荐 总有一款适合你
  8. python按键精灵找图教程_按键精灵如何找图 按键精灵找图教程
  9. Linux驱动系列目录
  10. Linux英伟达驱动程序下载和安装