KKSU
2024-05-30 84599f1fdac0d9723c7f02a2e66b0e909ad911d7
src/main/java/cc/mrbird/febs/mall/test/ImageToChar.java
@@ -1,156 +1,156 @@
package cc.mrbird.febs.mall.test;
import cn.hutool.core.util.ObjectUtil;
import com.madgag.gif.fmsware.AnimatedGifEncoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
 * 基于Java的图片字符画(含动图)
 * https://blog.csdn.net/weixin_53070478/article/details/127183821?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-4-127183821-blog-125549681.235^v43^pc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.3&utm_relevant_index=7
 */
public class ImageToChar {
    static char[] ss = " `.^,:~\"<!ct+{i7?u30pw4A8DX%#HWM".toCharArray();
    /**
     * 将输入的图片转换成灰度图片
     * @param bi
     * @return
     */
    public static BufferedWriter ImageToChar(BufferedImage bi,String target){        //定义灰度方法  返回值为BufferedImage对象
        int width = bi.getWidth();
        int height =bi.getHeight();
        BufferedWriter bw = null;  //构建新的对象模型
        try {
            bw = new BufferedWriter(new FileWriter(target),360);
            // 遍历图片的RGB值,把得到的灰度值存到bufferedImage_end中,然后返回bufferedImage_end
            int autoAdd = 2;//自增
            for (int j = 0; j < height; j += autoAdd) {
                for (int i = 0; i < width; i += autoAdd) {
                    int pixel = bi.getRGB(i, j);
                    int[] rgb = new int[3];
                    rgb[0] = pixel >> 16 & 0xff;
                    rgb[1] = pixel >> 8 & 0xff;
                    rgb[2] = pixel & 0xff;
                    int Gray = (rgb[0] * 28 + rgb[1] * 151 + rgb[2] * 77) >> 8; //通过三原色值计算像素点的灰度
                    int x = Gray * ss.length / 255 % ss.length;     //灰度值的百分比 计算出相应密度的字符表
                    bw.write(ss[x]);    //输出该字符
                    bw.write(ss[x]);
                }
                bw.newLine();
            }
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bw;
    }
    /**
     * GIF转图片
     * https://blog.csdn.net/adminstate/article/details/128917090?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171653969716800197097670%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171653969716800197097670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128917090-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E5%9B%BE%E7%89%87%E8%BD%ACGif&spm=1018.2226.3001.4187
     * @param args
     */
//    public static void main(String[] args) {
//        Integer scaleSize = 360;
//        GifDecoder gd = new GifDecoder();
//        try{
//            gd.read(Files.newInputStream(new File("D:\\image\\imageGif.gif").toPath()));
//            for (int i = 0; i < gd.getFrameCount(); i++) {  //逐帧转换为图片。
//                BufferedImage frame = gd.getFrame(i);
//                float width = frame.getWidth(); // 像素
//                float height = frame.getHeight(); // 像素
//                float scale = width/scaleSize;
//                BufferedImage buffImg = new BufferedImage(scaleSize, (int)(height/scale), BufferedImage.TYPE_INT_RGB);
//                //使用TYPE_INT_RGB修改的图片会变色
//                buffImg.getGraphics().drawImage(
//                        frame.getScaledInstance(scaleSize, (int)(height/scale), Image.SCALE_SMOOTH), 0,
//                        0, null);
//package cc.mrbird.febs.mall.test;
//
//                ImageIO.write(buffImg, "jpg", new File("D:\\image\\gif\\"+i+".png"));
//import cn.hutool.core.util.ObjectUtil;
//import com.madgag.gif.fmsware.AnimatedGifEncoder;
//
//import javax.imageio.ImageIO;
//import java.awt.image.BufferedImage;
//import java.io.BufferedWriter;
//import java.io.File;
//import java.io.FileWriter;
//import java.io.IOException;
//
///**
// * 基于Java的图片字符画(含动图)
// * https://blog.csdn.net/weixin_53070478/article/details/127183821?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-4-127183821-blog-125549681.235^v43^pc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.3&utm_relevant_index=7
// */
//public class ImageToChar {
//
//    static char[] ss = " `.^,:~\"<!ct+{i7?u30pw4A8DX%#HWM".toCharArray();
//
//    /**
//     * 将输入的图片转换成灰度图片
//     * @param bi
//     * @return
//     */
//    public static BufferedWriter ImageToChar(BufferedImage bi,String target){        //定义灰度方法  返回值为BufferedImage对象
//        int width = bi.getWidth();
//        int height =bi.getHeight();
//        BufferedWriter bw = null;  //构建新的对象模型
//        try {
//            bw = new BufferedWriter(new FileWriter(target),360);
//
//            // 遍历图片的RGB值,把得到的灰度值存到bufferedImage_end中,然后返回bufferedImage_end
//            int autoAdd = 2;//自增
//            for (int j = 0; j < height; j += autoAdd) {
//                for (int i = 0; i < width; i += autoAdd) {
//                    int pixel = bi.getRGB(i, j);
//                    int[] rgb = new int[3];
//                    rgb[0] = pixel >> 16 & 0xff;
//                    rgb[1] = pixel >> 8 & 0xff;
//                    rgb[2] = pixel & 0xff;
//                    int Gray = (rgb[0] * 28 + rgb[1] * 151 + rgb[2] * 77) >> 8; //通过三原色值计算像素点的灰度
//                    int x = Gray * ss.length / 255 % ss.length;     //灰度值的百分比 计算出相应密度的字符表
//                    bw.write(ss[x]);    //输出该字符
//                    bw.write(ss[x]);
//                }
//                bw.newLine();
//            }
//        }catch(IOException e){
//            System.out.println(e);
//            bw.flush();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return bw;
//    }
    /**
     * 图片转GIF
     * https://blog.csdn.net/adminstate/article/details/128917090?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171653969716800197097670%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171653969716800197097670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128917090-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E5%9B%BE%E7%89%87%E8%BD%ACGif&spm=1018.2226.3001.4187
     * @param args
     */
    public static void main(String[] args) {
        // 存放jpg文件目录
        String inpath = "D:\\image\\gif\\";
        //生成GIF
        AnimatedGifEncoder animatedGifEncoder = new AnimatedGifEncoder();
        animatedGifEncoder.setRepeat(0);
        animatedGifEncoder.start("D:\\image\\gif\\screenshot.gif");
        try{
            //获取目录下所有jpg及其他非gif图片文件
            String[] pic = new File(inpath).list();
            BufferedImage[] src = new BufferedImage[pic.length];
            for (int i = 0; i <= src.length; i++) {
                String pngPath = inpath + i + ".png";
                if(new File(pngPath).exists()){
                    animatedGifEncoder.setDelay(100); //设置播放间隔
                    src[i] = ImageIO.read(new File(pngPath)); // 读入需要播放的jpg文件
                    animatedGifEncoder.addFrame(src[i]);  //添加到帧中
                }
            }
            animatedGifEncoder.finish();
        }catch(IOException e){
            System.err.println("合成gif图失败");
        }
    }
    /**
     * 将GIF图片转换成字符串
     * @param args
     */
//    public static void main(String[] args) {
//        GifDecoder gd = new GifDecoder();
//        try{
//
//            gd.read(Files.newInputStream(new File("D:\\image\\gif\\screenshot.gif").toPath()));
//            System.out.println(gd.getFrameCount());
//            for (int i = 0; i < gd.getFrameCount(); i++) {  //逐帧转换为字符集。
//                System.out.println(gd.getFrameCount());
//                BufferedImage frame = gd.getFrame(i);
//                ImageToChar(frame,"D:\\image\\ImageToChar.txt");    //参数提供缓冲图片对象,以及目标文本输出地址。
//                try {
//                    Thread.sleep(500);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//    /**
//     * GIF转图片
//     * https://blog.csdn.net/adminstate/article/details/128917090?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171653969716800197097670%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171653969716800197097670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128917090-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E5%9B%BE%E7%89%87%E8%BD%ACGif&spm=1018.2226.3001.4187
//     * @param args
//     */
////    public static void main(String[] args) {
////        Integer scaleSize = 360;
////        GifDecoder gd = new GifDecoder();
////        try{
////            gd.read(Files.newInputStream(new File("D:\\image\\imageGif.gif").toPath()));
////            for (int i = 0; i < gd.getFrameCount(); i++) {  //逐帧转换为图片。
////                BufferedImage frame = gd.getFrame(i);
////                float width = frame.getWidth(); // 像素
////                float height = frame.getHeight(); // 像素
////                float scale = width/scaleSize;
////                BufferedImage buffImg = new BufferedImage(scaleSize, (int)(height/scale), BufferedImage.TYPE_INT_RGB);
////                //使用TYPE_INT_RGB修改的图片会变色
////                buffImg.getGraphics().drawImage(
////                        frame.getScaledInstance(scaleSize, (int)(height/scale), Image.SCALE_SMOOTH), 0,
////                        0, null);
////
////                ImageIO.write(buffImg, "jpg", new File("D:\\image\\gif\\"+i+".png"));
////            }
////        }catch(IOException e){
////            System.out.println(e);
////        }
////    }
//
//
//    /**
//     * 图片转GIF
//     * https://blog.csdn.net/adminstate/article/details/128917090?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171653969716800197097670%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171653969716800197097670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128917090-null-null.142^v100^pc_search_result_base8&utm_term=java%20%E5%9B%BE%E7%89%87%E8%BD%ACGif&spm=1018.2226.3001.4187
//     * @param args
//     */
//    public static void main(String[] args) {
//        // 存放jpg文件目录
//        String inpath = "D:\\image\\gif\\";
//
//        //生成GIF
//        AnimatedGifEncoder animatedGifEncoder = new AnimatedGifEncoder();
//        animatedGifEncoder.setRepeat(0);
//        animatedGifEncoder.start("D:\\image\\gif\\screenshot.gif");
//
//        try{
//            //获取目录下所有jpg及其他非gif图片文件
//            String[] pic = new File(inpath).list();
//            BufferedImage[] src = new BufferedImage[pic.length];
//
//            for (int i = 0; i <= src.length; i++) {
//                String pngPath = inpath + i + ".png";
//                if(new File(pngPath).exists()){
//                    animatedGifEncoder.setDelay(100); //设置播放间隔
//                    src[i] = ImageIO.read(new File(pngPath)); // 读入需要播放的jpg文件
//                    animatedGifEncoder.addFrame(src[i]);  //添加到帧中
//                }
//            }
//            animatedGifEncoder.finish();
//        }catch(IOException e){
//            System.out.println(e);
//            System.err.println("合成gif图失败");
//        }
//    }
    /**
     * 将图片转换成字符串
     * @param args
     */
//    public static void main(String[] args) {
//        try{
//            ImageToChar(
//                    ImageIO.read(new File("D:\\image\\outDpi.png")),
//                    "D:\\image\\ImageToChar.txt");
//        }catch(IOException e){
//            System.out.println(e);
//        }
//    }
}
//
//    /**
//     * 将GIF图片转换成字符串
//     * @param args
//     */
////    public static void main(String[] args) {
////        GifDecoder gd = new GifDecoder();
////        try{
////
////            gd.read(Files.newInputStream(new File("D:\\image\\gif\\screenshot.gif").toPath()));
////            System.out.println(gd.getFrameCount());
////            for (int i = 0; i < gd.getFrameCount(); i++) {  //逐帧转换为字符集。
////                System.out.println(gd.getFrameCount());
////                BufferedImage frame = gd.getFrame(i);
////                ImageToChar(frame,"D:\\image\\ImageToChar.txt");    //参数提供缓冲图片对象,以及目标文本输出地址。
////                try {
////                    Thread.sleep(500);
////                } catch (InterruptedException e) {
////                    e.printStackTrace();
////                }
////            }
////        }catch(IOException e){
////            System.out.println(e);
////        }
////    }
//
//    /**
//     * 将图片转换成字符串
//     * @param args
//     */
////    public static void main(String[] args) {
////        try{
////            ImageToChar(
////                    ImageIO.read(new File("D:\\image\\outDpi.png")),
////                    "D:\\image\\ImageToChar.txt");
////        }catch(IOException e){
////            System.out.println(e);
////        }
////    }
//}