1、本来需求是: 将拍照的图片,根据合适的比例缩放、扩大放到word文档

问题是:如何合适的要放大缩小的比例

比如:图片很大,文字很小;文字集中在一块;文字图片上传倾斜;图片中含有 如函数图

解决方案:

1、将图片切割成几部分

2、通过BufferedImage 扫描图片

3、纵向扫描,扫描过程中,该行像素不是 ("#ffffffff")(全白) 就归类为一个字(且连续),计算这个字的高度,放到集合中

4、去掉极端的数据:不满足一个字的最低高度( 比如 一个横线,一个点...)

5、经行格列布斯准则,根据波动异常 剔除掉 异常数据

6、将剔除了异常数据的 数据,取 平均值, 得到 这此扫描 较为合理的 字体高度

7、字体高度 与 标准字号 H5 字体高度的比值,来定需要 放大;缩小的比例

truncat 这个接口需要 进入 5 格列布斯 准则, 案例

import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;import javax.imageio.ImageIO;
public class JustStudy {
    String openUrl; // 原始图片打开路径
     int part;//需要切割成几份扫描    public JustStudy(String openUrl,int part) {
         this.openUrl = openUrl;
         this.part = part;
     }    /**
      * 得到文字行与图片高度
      */
     public float getFontHeight(){
         float result = 0f;
         int[] startRow;// 字起始行
         int endRow = 0;// 字结束行
         File file = new File(openUrl);
         BufferedImage bimg=null;// 将图片缓冲到内存中,BufferedImage生成的图片在内存里有一个图像缓冲区
         if(null!=file){
         try {
             bimg= ImageIO.read(file);
         } catch (IOException e) {
             e.printStackTrace();
             System.out.println("未找到图片");
         }
         //将该图片切割成几份
         List<BufferedImage> cutImage = randomCut(bimg,part);
         ArrayList<Double> hignNums = new ArrayList<>();
         for (BufferedImage litleBimg : cutImage) {
             int [][]data = new int[litleBimg.getWidth()][litleBimg.getHeight()];
             startRow = new int[litleBimg.getHeight()];
             int n = 0;
             //通过getRGB()方式获得像素矩阵 : 此方式为沿width方向扫描
             for(int y=0;y<litleBimg.getHeight();y++){
                 for(int x=0;x<litleBimg.getWidth();x++){
                     data[x][y]=litleBimg.getRGB(x,y);
                     // 该行像素不是 ("#ffffffff")即全白 就归类为一个字
                     if (!("ffffffff".equals(String.format("%x",data[x][y])))){
                         startRow[n] = y;//统计该字体高度
                         n++;
                         break;//一行只记一个
                     }                }
             }
             int k = 0;
             //用来计一个字的向上延展有多少像素
             int[] hignSpace = new int[startRow.length];
             int temp = 0;
             for (int i=0;i<startRow.length;i++) {
                 //除第一行,需要连续
                 if (i != startRow.length-1 && !((startRow[i+1]-startRow[i]) == 1)){
                     if (k ==0){
                         hignSpace[k] = startRow[i] - startRow[0];
                     }else {
                         hignSpace[k] = startRow[i] - temp;
                     }
                     temp = startRow[i+1];
                     k++;
                 }
             }
             System.out.println("各个间隔:" + Arrays.toString(hignSpace));
             //去掉极端数据
             int[] newArray = cutZero(hignSpace);
             System.out.println("去除极端数据:"+Arrays.toString(newArray));
             ArrayList<Double> dataDouble = new ArrayList<>();
             for(int i=0 ; i<newArray.length;i++){
                 dataDouble.add((double)newArray[i]);
             }
             Truncat truncat = new Truncat(dataDouble);
             //处理波动较大的数据
             truncat.calc();
             System.out.println("处理过后:"+dataDouble.toString());
             double pingJunJianGe = truncat.calcAverage(dataDouble);
             System.out.println("平均间隔:" + pingJunJianGe);
             hignNums.add(pingJunJianGe);
         }
         Truncat truncat = new Truncat(hignNums);
         //处理波动较大的数据
         truncat.calc();
         System.out.println("处理过后:"+hignNums.toString());
         double pingJunJianGe = truncat.calcAverage(hignNums);
         System.out.println("平均间隔:" + pingJunJianGe);
     }else{
         System.out.println("文件读取有误,请确认文件地址");
     }
         return result;
     }    /**
      * 去掉极端数值
      * @param oldArr
      * @return
      */
     private int[] cutZero(int[] oldArr) {
         int zero=0;
         for(int i=0;i<oldArr.length;i++){
             if(oldArr[i]<8){
                 zero++;
             }
         }
         int newArr[]=new int[oldArr.length-zero]; // 定义新的数组 长度是 原来旧的数组的长度减去0的个数
         int j=0; // 新数组的索引
         for(int i=0;i<oldArr.length;i++){ // 遍历原来旧的数组
             if(oldArr[i]>=8){ // 假如不等于0
                 newArr[j]=oldArr[i]; // 赋值给新的数组
                 j++;
             }
         }
         return newArr;
     }
     
     /**
      * 把一张图片垂直等分
      *
      * @param bimg
      * @param time
      * @return
      */
     private List<BufferedImage> randomCut(BufferedImage bimg, int time) {
         ArrayList list = new ArrayList();
         int width = bimg.getWidth();
         int sPerTime = width / time;
         for (int i = 0; i < time; i++) {
             BufferedImage newBuffer = bimg.getSubimage(i * sPerTime, 0, sPerTime, bimg.getHeight());
             list.add(newBuffer);
         }
         return list;
     }    public static void main(String [] args){
 //        JustStudy JustStudy1 =
 //                new JustStudy("F:/错题图片/1.jpg","F:/错题图片","1","jpg");
 //        JustStudy1.getFontHeight();
 //        JustStudy JustStudy2 =
 //                new JustStudy("F:/错题图片/2.jpg","F:/错题图片","2","jpg");
 //        JustStudy2.getFontHeight();
 //        JustStudy JustStudy3 =
 //                new JustStudy("F:/错题图片/3.jpg","F:/错题图片","3","jpg");
 //        JustStudy3.getFontHeight();
 //        JustStudy JustStudy4 =
 //                new JustStudy("F:/错题图片/4.jpg","F:/错题图片","4","jpg");
 //        JustStudy4.getFontHeight();
 //        JustStudy JustStudy5 =
 //                new JustStudy("F:/错题图片/5.jpg","F:/错题图片","5","jpg");
 //        JustStudy5.getFontHeight();
 //        JustStudy JustStudy6 =
 //                new JustStudy("F:/错题图片/6.jpg","F:/错题图片","6","jpg");
 //        JustStudy6.getFontHeight();
 //        JustStudy JustStudy7 =
 //                new JustStudy("F:/错题图片/7.jpg","F:/错题图片","7","jpg");
 //        JustStudy7.getFontHeight();
 //        JustStudy JustStudy8 =
 //                new JustStudy("F:/错题图片/8.jpg","F:/错题图片","8","jpg");
 //        JustStudy8.getFontHeight();
 //        JustStudy JustStudy9 =
 //                new JustStudy("F:/错题图片/9.jpg","F:/错题图片","9","jpg");
 //        JustStudy9.getFontHeight();
 //        JustStudy JustStudy10 =
 //                new JustStudy("F:/错题图片/10.jpg","F:/错题图片","10","jpg");
 //        JustStudy10.getFontHeight();
         JustStudy JustStudy11 =
                 new JustStudy("F:/错题图片/11.jpg",5);
         JustStudy11.getFontHeight();    }