java实现抖音代码舞源码

本文实例为大家分享了java实现抖音代码舞源码,供大家参考,具体内容如下

Client.java

package com.dance;

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
/**
 * //gif图片路径,推荐使用像素在400*400以内的
 * //gif图片生成路径,这里没有整合AnimatedGifEncoder包
 * //所以生成的是一些jpg图片,需要自己借助其他工具整个成gif
 * //如果有条件可以继续改进,直接生成一个gif文件
* @ClassName: Client
* @Description: TODO(这里用一句话描述这个类的作用)
* @author baitp
* @date 2018年12月27日
*
 */
public class Client {

 public static String input = "2.gif";
 public static String output = "D://charGif//";
 public static void main(String[] args) {
 EventQueue.invokeLater(new Runnable() {

 @Override
 public void run() {
 MainFrame mainFrame = new MainFrame();
 //创建并添加菜单栏
  JMenuBar menuBar = new JMenuBar();
  JMenu menuFile = new JMenu("GIF图片");
  menuBar.add(menuFile);
  JMenuItem itemSave = new JMenuItem("上传");
//  itemSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
  menuFile.add(itemSave);
  mainFrame.setJMenuBar(menuBar);
 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 mainFrame.setVisible(true);
 itemSave.addActionListener(new ActionListener() {
 @Override
 public void actionPerformed(ActionEvent e) {
 JFileChooser fd = new JFileChooser();
 //fd.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
 fd.showOpenDialog(null);
 fd.setFileSelectionMode(0);
 File f = fd.getSelectedFile();
 String url =Client.class.getClassLoader().getResource("").getFile()+"image/"+f.getName();
 File outfile = new File(url);
 try {
 FileInputStream fi = new FileInputStream(f);
 FileOutputStream out =new FileOutputStream(outfile);
 //创建搬运工具
   byte datas[] = new byte[1024*8];
   //创建长度
   int len = 0;
   //循环读取数据
   while((len = fi.read(datas))!=-1){
   out.write(datas,0,len);
   }
   Client.input=f.getName();
   //3.释放资源
   fi.close();
   out.close();
 } catch (Exception e1) {
 e1.printStackTrace();
 }
 }
 });
 }
 });
 }
}

@SuppressWarnings("serial")
class MainFrame extends JFrame {
 private int x;
 private int y;
 public static int WIDTH = 0;
 public static int HEIGHT = 0;
 {
 Toolkit kit = Toolkit.getDefaultToolkit();
 int screen_width = kit.getScreenSize().width;
 int screen_height = kit.getScreenSize().height;
 x = (screen_width-WIDTH)/2;
 y = (screen_height-HEIGHT)/2;
 }
 public MainFrame() {
 setTitle("intlstar code dance 666");
 initBounds();
 createGIF();
 setBounds(x, y, WIDTH, HEIGHT);
 setResizable(false);
 setIconImage(null);

 JPanel panel = new GamePanel();
 Container container = getContentPane();
 container.add(panel);
 }
 //将字符图片输出到指定目录
 public void createGIF() {
 BufferedImage[] charImgs = ImgToCharacter.getCharImgs();
 try {
 for (int i=0; i<charImgs.length; i++) {
 File file = new File(Client.class.getClassLoader().getResource("").getFile()+"chargif/"+i+".jpg");
 ImageIO.write(charImgs[i], "jpg", file);
 }
 } catch (IOException e) {
 e.printStackTrace();
 }
 System.out.println("图片输出完成!");
 }
 public void initBounds() {
 ImgToCharacter.readGiF();
 ImgToCharacter.draw();
 BufferedImage[] charImgs = ImgToCharacter.getCharImgs();
 int max_width = 0;
 int max_height = 0;
 for (BufferedImage img : charImgs) {
 if(img.getWidth() > max_width)
 max_width = img.getWidth();
 if(img.getHeight() > max_height)
 max_height = img.getHeight();
 }
 WIDTH = max_width;
 HEIGHT = max_height;
 }
}

GamePanel.java

package com.dance;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GamePanel extends JPanel{

 private int fps = 6;
 private BufferedImage[] charImgs;
 int count = 0;
 private BufferedImage background = null;
 public GamePanel() {
 charImgs = ImgToCharacter.getCharImgs();
 initBackgroudImg();
 Thread t = new MyThread();
 t.start();
 }
 public void initBackgroudImg() {
 background = new BufferedImage(MainFrame.WIDTH, MainFrame.HEIGHT, BufferedImage.TYPE_INT_RGB);
 Graphics gb = background.getGraphics();
 gb.setColor(Color.white);
 gb.fillRect(0, 0, background.getWidth(), background.getHeight());
 gb.dispose();
 }
 @Override
 public void paint(Graphics g) {
 super.paint(g);
 int size = charImgs.length;
 int index = count % size;
 BufferedImage img = charImgs[index];
 int w = img.getWidth();
 int h = img.getHeight();
// int x = (MainFrame.WIDTH - w)/2;
// int y = (MainFrame.HEIGHT - h)/2;
 //背景涂白
 g.setColor(Color.white);
 g.fillRect(0, 0, MainFrame.WIDTH, MainFrame.HEIGHT);
 g.setColor(Color.black);
 // 3/4为显示比例,考虑到有的gif图片太大,所以缩小至一定比例在窗口中显示
 g.drawImage(img, 0, MainFrame.HEIGHT - h,w*3/4, h*3/4, null);
 count++;
 }

 class MyThread extends Thread {

 long startTime;
 long endTime;
 long sleepTime;
 long spendTime;
 long period = 1000/fps;
 @Override
 public void run() {
 while(true) {
 startTime = System.currentTimeMillis();
 repaint();
 endTime = System.currentTimeMillis();
 spendTime = endTime - startTime;
 sleepTime = period - spendTime;
 if(sleepTime < 0)
 sleepTime = 2;
 try {
 Thread.sleep(sleepTime);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }

 }
 }

 }
}

ImgToCharacter.java

package com.dance;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class ImgToCharacter {

 private static BufferedImage[] realImgs;
 private static BufferedImage[] charImgs;
 private static int size = 4;
 private static String[] chars= {" ",".",":",";","-","~","1","i","o","r","a",
  "2","c","3","b","n","q","k","x","S","X",
  "7","Z","O","8","#","$","%","&","M","B",
  "W","@","@"};

 public static void draw() {
 int interval = 16777215 / (chars.length-1) ;
 BufferedImage oneRealImg = null;
 int index = 0;
 while(index < realImgs.length) {
 oneRealImg = realImgs[index];
 int width = oneRealImg.getWidth();
 int height = oneRealImg.getHeight();
 BufferedImage oneCharImg = new BufferedImage(width*3, height*3,BufferedImage.TYPE_INT_RGB);
 Graphics g = oneCharImg.getGraphics();
 g.setColor(Color.WHITE);
 g.fillRect(0, 0, oneCharImg.getWidth(), oneCharImg.getHeight());
 g.setColor(Color.BLACK);
 g.setFont(new Font("黑体", Font.BOLD, 15));

 for(int i= 0 ; i < height ; i+=size){
 for(int j = 0 ; j < width; j+=size){
  int rgb = getAvgRGB(j, i, oneRealImg);
 int k = rgb/interval;
 g.drawString(chars[k], 12*j/size, 12*i/size);
 }
 }
 g.dispose();
 charImgs[index] = oneCharImg;
 index++;
 }

 }
 public static void readGiF() {
 try {
 System.out.println(ImgToCharacter.class.getClassLoader().getResource("").getFile());
 File f = new File(ImgToCharacter.class.getClassLoader().getResource("").getFile()+"image/"+Client.input);
 String name = f.getName();
 String suffix = name.substring(name.lastIndexOf('.')+1);

 Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
 ImageReader reader = iter.next();
 ImageInputStream imageIn;
 imageIn = ImageIO.createImageInputStream(f);
 reader.setInput(imageIn);
 int count = reader.getNumImages(true);
 realImgs = new BufferedImage[count];
 charImgs = new BufferedImage[count];
 for(int i=0; i< count; i++) {
 realImgs[i] = reader.read(i);
 }

 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 public static BufferedImage[] getCharImgs() {
 return charImgs;
 }
 public static int getAvgRGB(int i, int j, BufferedImage img) {
 int result = 0;
 for(int m=0; m<size; m++) {
 for(int n=0; n<size; n++) {
 if(i+m < img.getWidth() && j+n < img.getHeight())
 result += img.getRGB(i+m, j+n);
 }
 }
 return Math.abs(result) / (size*size);
 }

}

完整源码下载地址:代码舞

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现抖音飞机大作战

    本文实例为大家分享了java抖音飞机大作战的具体代码,供大家参考,具体内容如下 Airplane.java package zmf.game.shoot; import java.util.Random; /** * @author jcf * @Description: Airplane----敌机既是飞行物 * @date 2018-03-28 11:17:16 */ public class Airplane extends FlyingObject implements Enemy{ /

  • java实现抖音代码舞源码

    本文实例为大家分享了java实现抖音代码舞源码,供大家参考,具体内容如下 Client.java package com.dance; import java.awt.Container; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.Buffere

  • python制作抖音代码舞

    本文实例为大家分享了抖音代码舞python制作代码,供大家参考,具体内容如下 一.效果图 二.转换代码 from img import Image ascil_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") table = ('#8XOHLTI)i=+;:,. ') # 对于灰度图像效果不错 img = image.open(&qu

  • Java实现天天酷跑小游戏完整代码(附源码)

    目录 首先,写一个需求文档: 一.登录界面 1.界面 2.登录 3.退出 二.开始游戏界面 三.缓冲加载游戏界面 四.游戏主界面 五.结束界面 上代码 首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的障碍物越多跑酷距离越远,玩家吃的金币越多,得分越高. 三.功能模块: 1.登录界面 用户名(输入框,明文) 密码(输入框,密文) 登录.取消按钮 2.菜单选择

  • 详解java实践SPI机制及浅析源码

    1.概念 正式步入今天的核心内容之前,溪源先给大家介绍一下关于SPI机制的相关概念,最后会提供实践源代码. SPI即Service Provider Interface,属于JDK内置的一种动态的服务提供发现机制,可以理解为运行时动态加载接口的实现类.更甚至,大家可以将SPI机制与设计模式中的策略模式建立联系. SPI机制: 从上图中理解SPI机制:标准化接口+策略模式+配置文件: SPI机制核心思想:系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编

  • 使用Java实现天天酷跑(附源码)

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的障碍物越多跑酷距离越远,玩家吃的金币越多,得分越高. 三.功能模块: 1.登录界面 用户名(输入框,明文) 密码(输入框,密文) 登录.取消按钮 2.菜单选择界面 开始游戏按钮(图片按钮) 帮助按钮 退出按钮 3.缓冲加载界面 自动加载进度条,加载完毕之后,跳转到下一界面 4.游戏主界面 移动的背景图片.动态

  • java实现简易超市管理系统 附源码下载

    java超市管理系统 1.0(含源文件,后续会继续优化~) 前言 一个月零零散散的时间学习了java,通过这次"超市管理系统"的练习,希望可以给一同开始学习java的朋友一些参考,更希望大佬们多多指点和批评~ 一.确定需求 程序概述: 小型超市商品销售管理系统选择小型超市的四类商品进行管理. 这四类商品是:食品.化妆品.生活用品和饮料(四个类). 每类商品都包含有商品名和商品利润 (其中包括商品的售价.进价.库存量).(五个属性) 每类不同的商品还有区别于其他商品的特殊信息(子类特有属

  • 关于Java Guava ImmutableMap不可变集合源码分析

    目录 Java Guava不可变集合ImmutableMap的源码分析 一.案例场景 二.ImmutableMap源码分析 Java Guava不可变集合ImmutableMap的源码分析 一.案例场景 遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样-- public static final Map<String,String> dayMap= new HashMap<>(); static { dayMap.put("

  • java编程Reference核心原理示例源码分析

    带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用ByteBuffer的allocateDirect方法,申请一块堆外内存创建一个DirectByteBuffer对象,然后利用它去操作堆外内存.这些申请完的堆外内存,我们可以回收吗?可以的话是通过什么样的机制回收的? 大家应该都知道WeakHashMap可以用来实现内存相对敏感的本地缓存,为什么WeakHashMap合适这种业务场景,其内部实现会做什么特殊处理呢?

  • 基于jQuery实现交互体验社会化分享代码附源码下载

    先给大家展示下效果图,看看是不是亲想要的效果,如果满足您的要求请继续往下阅读. 效果展示       源码下载 基于jQuery交互体验社会化分享代码.这是一款鼠标点击分享按钮向右滑出腾讯微博,新浪微博,QQ空间,豆瓣,微信,二维码分享等分享平台. html代码: <div style="text-align:center;font:normal 14px/24px 'MicroSoft YaHei';clear:both;width:160px;margin:0 auto;"&

  • Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理

    FileReader和FileWriter源码分析 1. FileReader 源码(基于jdk1.7.40) package java.io; public class FileReader extends InputStreamReader { public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fil java io系列21之 InputStreamReade

随机推荐