Java代码生成手写笔记

Java小白修炼手册


在家上网课时老师会不会需要你拍照上传你的笔记呢?
看完本文章让你告别手写笔记
话不多说,先来看一下效果图

是不是跟手写的一样
接下来直接上代码,由于没有啥技术含量,无非就是给图片添加水印
代码我就不再细说了
有兴趣的朋友可以自己看一下源码
主函数和实现方法不在同一个class,注意!!
主函数如下
起始的bg.jpg和biji.txt和ss2.ttf文件我会上传在笔记生成文件里,包括源码

import come.MainFuncation.WorkWrite;
import java.awt.*;
import java.util.Scanner;
public class StartFunction {

    public static void main(String[] args) {
        System.out.print("请输入你的作业题目:");
        Scanner scanner = new Scanner(System.in);
        String fileName=scanner.next();
        System.out.println("开始生成笔记...");
        //启动
        WorkWrite workWrite = new WorkWrite();
        String backgroundImgPath="bg2.jpg"; //纸张图片地址
        String bijiPath="biji.txt";//你的笔记文本的地址
        String fontPath="ss2.ttf";//你的自定义字体文件的地址
        Font newFont=workWrite.newFont(fontPath,110);//自定义字体和大小,未设置大小则默认90
        String[] txt=workWrite.MarkContent(bijiPath);//笔记文本
        workWrite.setRowlen(120);//设置行间距,未设置默认为100
        Color color= new Color(Color.black.getRGB());//文字为黑色
        workWrite.addWaterMark(backgroundImgPath, fileName,txt,color,newFont);//生成
        System.out.println("完成");
    }
}

你可以自定义bg.jpg,即更换纸张图片
将你网上白嫖来的笔记内容复制粘贴在biji.txt中
字体文件我已经提供2种(代码里用的第二种手写体,个人感觉比另一种真实),不需要更改,你也可以网上下载个其他的手写体

实现方法代码:
这部分代码是干活的

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
public class WorkWrite {

    private float fontSize=90;//字体大小
    private int rowlen=100;//行间距
    private int page=0;//页码
    /**
     * 绘制水印
     * @param split
     * @param markContentColor
     * @param font
     */
    public void addWaterMark(String backgroundImgPath, String resultImgPath, String[] split,Color markContentColor,Font font) {

        try {
            // 读取原图片信息
            File srcImgFile = new File(backgroundImgPath);//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g;
            g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            g.setColor(markContentColor); //设置水印颜色
            g.setFont(font);              //设置字体

            //内容起始坐标
            int x = 100;
            int y = 100;
            int maxWord= (int) (srcImgWidth/fontSize);//每行最多的字数
            for (int i=0;i<split.length;i++) {
                //字符串可能会出现��,导致出现一些空白,所以为了保险起见将这些字符替换成空字符串
                split[i]=split[i].replace("��","");
                //获取字符串的字数
                int collen=split[i].length();
                /*
                对每行的字符数进行规范
                 */

                if(collen>maxWord){//如果大于每行规定的字数
                    String substring = split[i].substring(0, maxWord);
                    g.drawString(substring, x, y);  //绘制从0截取到最大字数的字符串
                    y += rowlen;//换行
                    String more=split[i].substring(maxWord,collen);//截取多出来的字符串
                    g.drawString(more, x, y);//绘制多出来的字符串
                    y += rowlen;//换行
                }else {
                    //直接绘制
                    g.drawString(split[i], x, y);
                    y += rowlen;
                }
                //内容超出页面高度则分页
                if(y>=srcImgHeight-1.5*rowlen) {
                    g.dispose();
                    //导出已经写满的笔记
                    productImage(bufImg,resultImgPath,++page);
                    y=rowlen;
                    g = bufImg.createGraphics();
                    g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
                    g.setColor(markContentColor); //设置水印颜色
                    g.setFont(font);              //设置字体
                }
            }
            //将最后一张笔记生成
            g.dispose();
            productImage(bufImg,resultImgPath,++page);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生产笔记图片
     * @param image
     * @param tarImgPath
     * @param page
     */
    public void productImage(BufferedImage image,String tarImgPath,int page){
        try {
            tarImgPath=tarImgPath+page+".jpg";
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(image, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    /**
     * 获取笔记所有内容,存入字符串数组
     * @param path path
     * @return String[]
     */
    public String[] MarkContent(String path){
        StringBuilder builder = new StringBuilder();
        try {
            FileInputStream inputStream = new FileInputStream(path);
            byte[] bytes = new byte[1024];
            int temp;
            while ((temp=inputStream.read(bytes))!=-1){
                builder.append(new String(bytes,0,temp));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return builder.toString().split("。");
    }

    /**
     * 采用自定义手写字体,看起来更真实
     * @param path path
     * @param fontSize fontSize
     * @return Font
     */
    public Font newFont(String path,float fontSize){
        Font font = null;                     //水印字体
        try {
            font = Font.createFont(Font.TRUETYPE_FONT,new File(path));
            font=font.deriveFont(fontSize);
            setFontSize(fontSize);
        } catch (FontFormatException | IOException e) {
            e.printStackTrace();
        }
        return font;
    }
    public void setFontSize(float size){
        this.fontSize=size;
    }
    public void setRowlen(int rowlen){
        this.rowlen=rowlen;
    }
}

整体运行一下
这是biji.txt的内容
Java代码生成手写笔记_第1张图片
运行时输入作业名称
Java代码生成手写笔记_第2张图片
回车运行
Java代码生成手写笔记_第3张图片
运行完成后会在桌面生成一个output的文件夹

Java代码生成手写笔记_第4张图片
里面的图片就是你的笔记,笔记名字就是你开始时输入的
Java代码生成手写笔记_第5张图片
大功告成!
相信老师应该看不出来,哈哈
如果有疑问可以评论区留言,包回复
如果有不足之处望指出,感谢阅读!!

你可能感兴趣的:(JAVA小程序)