java图片转字符画
先来效果图,如下
将图片转换为字符画
思路:读取图片,图片灰化,根据色彩程度选择对应的字符,按照坐标创建图片并将字符画上去
成品图
代码结构图
MainGUI是程序入口,beautyeye_Inf.jar是界面主题jar包,可不需要,gifdecoder.jar是处理gif动态图的jar包,网上不好找,但是可以找到对应的代码,自行打包成jar,请见:
https://blog.csdn.net/rico_zhou/article/details/81301566
代码
MainGUI
package mainGUI;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;
import javax.swing.plaf.FontUIResource;
import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper;
import controller.CharImgController;
import utils.ImageUtils;
public class MainGUI extends JFrame implements ActionListener {
public JPanel jp1;
public JLabel jlb1, jlb2, jlb3, jlb4, jlb5, jlb6, jlb7, jlb8, jlb9, jlb10;
public JButton button1, button2, button3, button4;
public SwingWorker<ReturnMsg, String> sw1;
private JComboBox jcb1, jcb2, jcb3, jcb4, jcb5;
public JRadioButton jrb1, jrb2;
public ButtonGroup bg1;
public JTextField tt1, tt2, tt3, tt4, tt5, tt6, tt7;
public JFileChooser jfc1, jfc2;
public File file;
public BufferedImage bi1, bi2;
public static int numImage = 0;
public ImageUtils iu = new ImageUtils();
private static boolean isRunning;
public CharImgController cic = new CharImgController();
public ReturnMsg f;
// 是否是gif
public boolean isGif;
// gif图片集合
public List<BufferedImage> list = new ArrayList<BufferedImage>();
// 缩放后集合
public List<BufferedImage> list2 = new ArrayList<BufferedImage>();
public List<Integer> list3 = new ArrayList<Integer>();
public GifMsg gm = new GifMsg();
public MainGUI() {
// 初始化主题
initTheme();
// 初始化界面
init();
}
private void initTheme() {
// 国人牛逼主题,值得学习
// 初始化字体
InitGlobalFont(new Font("微软雅黑", Font.PLAIN, 13));
// 设置本属性将改变窗口边框样式定义
// 系统默认样式 osLookAndFeelDecorated
// 强立体半透明 translucencyAppleLike
// 弱立体感半透明 translucencySmallShadow
// 普通不透明 generalNoTranslucencyShadow
BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.generalNoTranslucencyShadow;
// 设置主题为BeautyEye
try {
org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
} catch (Exception e) {
e.printStackTrace();
}
// 隐藏“设置”按钮
UIManager.put("RootPane.setupButtonVisible", false);
// 开启/关闭窗口在不活动时的半透明效果
// 设置此开关量为false即表示关闭之,BeautyEye LNF中默认是true
BeautyEyeLNFHelper.translucencyAtFrameInactive = false;
// 设置BeantuEye外观下JTabbedPane的左缩进
// 改变InsetsUIResource参数的值即可实现
UIManager.put("TabbedPane.tabAreaInsets", new javax.swing.plaf.InsetsUIResource(3, 20, 2, 20));
//
// 切换主题,此主题在圆形窗口有标题栏
try {
// UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
}
// font
private static void InitGlobalFont(Font font) {
FontUIResource fontRes = new FontUIResource(font);
for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof FontUIResource) {
UIManager.put(key, fontRes);
}
}
}
// 主方法
public static void main(String[] args) {
// 线程启动截图主程序
EventQueue.invokeLater(new Runnable() {
public void run() {
new MainGUI();
}
});
}
private void init() {
// 初始化面板
jp1 = new JPanel();
jp1.setLayout(null);
// 基本设置
jlb1 = new JLabel("基本设置:");
jlb1.setBounds(20, 10, 80, 25);
jp1.add(jlb1);
jlb2 = new JLabel("缩放图片大小:");
jlb2.setBounds(47, 40, 100, 25);
jp1.add(jlb2);
String[] sfImage = { "原图尺寸", "100x100", "200x200", "300x300", "400x400", "500x500", "自定义" };
jcb1 = new JComboBox(sfImage);
// 设置默认显示值
jcb1.setSelectedIndex(0);
jp1.add(jcb1);
jcb1.setBounds(140, 40, 100, 25);
tt1 = new JTextField();
tt1.setBounds(250, 40, 60, 25);
jp1.add(tt1);
tt1.setVisible(false);
jlb3 = new JLabel("x");
jlb3.setBounds(317, 40, 10, 25);
jp1.add(jlb3);
jlb3.setVisible(false);
tt2 = new JTextField();
tt2.setBounds(330, 40, 60, 25);
jp1.add(tt2);
tt2.setVisible(false);
jcb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 自定义
if (jcb1.getSelectedIndex() == sfImage.length - 1) {
tt1.setVisible(true);
jlb3.setVisible(true);
tt2.setVisible(true);
} else {
tt1.setVisible(false);
jlb3.setVisible(false);
tt2.setVisible(false);
}
}
});
jlb4 = new