package czc.superzig.modular.utils;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import java.awt.*;
import java.awt.geom.Path2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
/**
* @program: superzig-function c
* @description:
* @author: Mr.L
* @create: 2019-04-25 19:45
* 抠图
**/
public class ImgUtil {
private static final String SEPARATOR=File.separator;
//根据 x y w h 第一点的坐标矩形的宽度 和长
public static String readUsingImageReader(String imgUrl, Integer x, Integer y, Integer width, Integer heigth) {
String pathUrl = SEPARATOR +"home"+SEPARATOR + SEPARATOR + "tupian";
File file = new File(pathUrl);
if (!file.exists()){
file.mkdirs();
}
String path=pathUrl+SEPARATOR+ IdUtil.simpleUUID() + ".jpg";
try {
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader =readers.next();
InputStream source = new FileInputStream(imgUrl);
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
//100,200是左上起始位置,300就是取宽度为300的,就是从100开始取300宽,就是横向100~400,同理纵向200~350的区域就取高度150
Rectangle rect = new Rectangle(x, y, width, heigth);
param.setSourceRegion(rect);
BufferedImage bi = reader.read(0, param);
ImageIO.write(bi, "jpg", new File(path));
} catch (IOException e) {
e.printStackTrace();
}
return path;
}
public static String readUsingImageReader(String imgUrl, Integer point0x,Integer point0y,Integer point1x,Integer point1y,Integer point2x,Integer point2y,Integer point3x,Integer point3y) throws IOException {
//计算矩形的长和宽
Integer width=(int) Math.pow(Math.pow(point0x-point1x, 2)+Math.pow(point0y-point1y, 2), 0.5);
Integer heigth=(int) Math.pow(Math.pow(point1x-point2x, 2)+Math.pow(point1y-point2y, 2), 0.5);
BigDecimal y=new BigDecimal(point1y-point0y);
BigDecimal x=new BigDecimal(point1x-point0x);
//旋转图片
File ecgFile = new File(imgUrl);
BufferedImage ecgImage = ImageIO.read(ecgFile);
double degree=new BigDecimal(90).multiply(y.abs().divide(x.abs().add(y.abs()))).setScale(3).doubleValue();
BigDecimal bigZero=new BigDecimal(0);
x=(x.compareTo(bigZero)==0?bigZero:x);
y=(y.compareTo(bigZero)==0?bigZero:y);
degree=(x.multiply(y)).compareTo(bigZero)>0?-degree:degree;
ecgImage=rotateImage(ecgImage, degree,point0x,point0y,0.5);
ImageIO.write(ecgImage, "jpg", ecgFile);
String path=readUsingImageReader(imgUrl, (int)(point0x*0.5), (int)(point0y*0.5), (int)(width*0.5), (int)(heigth*0.5));
//反向旋转图片
//ecgImage=rotateImage(ecgImage, -1*degree);
return path;
}
/**
*根据坐标点切割图形
*
* @author Administrator
* @Param imgUrl需要切割的图片
* @Param List<Point> 点列表
*/
public static String readUsingImageReader(String imgUrl,java.util.List<Point> pointList) throws IOException {
if(StrUtil.isBlank(imgUrl)){
throw new NullPointerException();
}
java.util.List<Point> socPointList=new ArrayList<>(pointList);
//设置图片导出路径
String pathUrl = SEPARATOR +"home"+SEPARATOR + SEPARATOR + "tupian";
//String pathUrl=separator+"image";
File file = new File(pathUrl);
if (!file.exists()){
file.mkdirs();
}
String path=pathUrl+SEPARATOR+ IdUtil.simpleUUID() + ".jpg";
//找到最大坐标
Collections.sort(pointList, new Comparator<Point>(){
@Override
public int compare(Point p1, Point p2) {
//排序属性
if(p1.getXCoordinate() <=p2.getXCoordinate()){
return 1;
}
return -1;
}
});
Integer maxXcoordinate=pointList.get(0).getXCoordinate();
Integer minXcoordinate=pointList.get(pointList.size()-1).getXCoordinate();
Collections.sort(pointList, new Comparator<Point>(){
@Override
public int compare(Point p1, Point p2) {
//排序属性
if(p1.getYCoordinate() <=p2.getYCoordinate()){
return 1;
}
return -1;
}
});
Integer maxYcoordinate=pointList.get(0).getYCoordinate();
Integer minYcoordinate=pointList.get(pointList.size()-1).getYCoordinate();
BufferedImage bufferedimage=ImageIO.read(new File(imgUrl));
// int w = bufferedimage.getWidth();// 得到图片宽度。
// int h = bufferedimage.getHeight();// 得到图片高度。
//int type = bufferedimage.getColorModel().getTransparency();// 得到图片透明度。
BufferedImage img;// 空的图片。
Graphics2D graphics2d;// 空的画笔。
(graphics2d = (img = new BufferedImage(maxXcoordinate, maxYcoordinate, BufferedImage.TYPE_INT_RGB))
.createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//创建一个path
//设置背景色
graphics2d.setBackground(Color.white);
graphics2d.clearRect(0, 0, maxXcoordinate, maxYcoordinate);
Path2D outline=new Path2D.Double();
for(int p=0;p<socPointList.size();p++){
Point point=socPointList.get(p);
if(p==0){
outline.moveTo(point.getXCoordinate(), point.getYCoordinate());
}else{
outline.lineTo(point.getXCoordinate(), point.getYCoordinate());
}
}
//收尾闭合
outline.closePath();
graphics2d.clip(outline);
// 从bufferedimagecopy图片至img,0,0是img的坐标。
graphics2d.drawImage(bufferedimage,0,0,null);
// 空的图片。
BufferedImage img1;
// 空的画笔。
Graphics2D graphics2d1;
(graphics2d1 = (img1 = new BufferedImage(maxXcoordinate-minXcoordinate,maxYcoordinate-minYcoordinate, BufferedImage.TYPE_INT_RGB))
.createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
// 从bufferedimagecopy图片至img,0,0是img的坐标。
graphics2d1.drawImage(img,0,0,maxXcoordinate-minXcoordinate,maxYcoordinate-minYcoordinate,minXcoordinate,minYcoordinate,maxXcoordinate,maxYcoordinate,null);
graphics2d1.dispose();
ImageIO.write(img1, "jpg", new File(path));
return path;
}
/**
*旋转图片
*
*/
public static BufferedImage rotateImage( BufferedImage bufferedimage, double degree,int x,int y,double scale) {
int w = bufferedimage.getWidth();
int h = bufferedimage.getHeight();
int type = bufferedimage.getColorModel().getTransparency();
BufferedImage img;// 空的图片。
Graphics2D graphics2d;// 空的画笔。
(graphics2d = (img = new BufferedImage(w, h, type))
.createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.scale(scale, scale);
// 旋转,degree是整型,度数,比如垂直90度。
graphics2d.rotate(Math.toRadians(degree), x, y);
// 从bufferedimagecopy图片至img,0,0是img的坐标。
graphics2d.drawImage(bufferedimage,0,0, null);
graphics2d.dispose();
return img;
}
public static int angle(int x1,int y1,int x2,int y2){
int angle = 0;
int x=Math.abs(x1-x2);
int y=Math.abs(y1-y2);
double z=Math.sqrt(x*x+y*y);
//最终角度
angle=Math.round((float)(Math.asin(y/z)/Math.PI*180));
return angle;
}
public static BufferedImage rotate(Image src, int angel) {
int srcWidth = src.getWidth(null );
int srcHeight = src.getHeight(null);
// calculate the new image size
// Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(
// src_width, src_height)), angel);
Rectangle rectDes = new Rectangle(new Dimension(srcWidth, srcHeight));
BufferedImage res = null;
res = new BufferedImage(rectDes.width, rectDes.height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = res.createGraphics();
Graphics2D g3 = res.createGraphics();
// transform
g2.translate((rectDes.width - srcWidth) ,
(rectDes.height - srcHeight) );
g2.rotate(Math.toRadians(angel), 0 , 0 );
g3.setPaint(Color.WHITE);
g3.fill(rectDes);
g2.drawImage(src, null, null);
System.err.println(res);
try {
ImageIO.write(res,"png",new File("D:/tupian/22.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
return res;
}
public static Rectangle calcRotatedSize(Rectangle src, int angel) {
// if angel is greater than 90 degree, we need to do some conversion
int ang=90;
if (angel >= ang) {
// if(angel / 90 % 2 == 1){
// int temp = src.height;
// src.height = src.width;
// src.width = temp;
// }
angel = angel % ang;
}
double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;
double angelAlpha = (Math.PI - Math.toRadians(angel)) / 2;
double angelDaltaWidth = Math.atan((double) src.height / src.width);
double angelDaltaHeight = Math.atan((double) src.width / src.height);
int lenDaltaWidth = (int) (len * Math.cos(Math.PI - angelAlpha
- angelDaltaWidth));
int lenDaltaHeight = (int) (len * Math.cos(Math.PI - angelAlpha
- angelDaltaHeight));
int desWidth = src.width + lenDaltaWidth * 2;
int desHeight = src.height + lenDaltaHeight * 2;
return new java.awt.Rectangle(new Dimension(desWidth, desHeight));
}
}