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(); }