java图片转字符画

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值