批量图片裁剪
pom.xml
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>9.0.45</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
import com.google.common.io.Files;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import static org.example.HttpUtil.downloadImage;
public class 图片裁剪 {
public static void main(String[] args) throws IOException {
List<String> folderList = new ArrayList<>();
folderList.add("D:\\image\\images\\草履蚧\\草履蚧");
folderList.add("D:\\image\\images\\褐边绿刺蛾\\褐边绿刺蛾");
for (String folder : folderList) {
getFiles(folder, "");
}
}
public static void getFiles(String path, String url) throws IOException {
/*** *******************************************************************************************/
File file = new File(path);
File[] tempList = file.listFiles();
List<标注实体> listBean = new ArrayList<>();
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
File fileXml = tempList[i];
标注实体 Bean = new 标注实体();
Bean.setName(fileXml.getName());
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(fileXml))) {
String str = null;
int flag = 0;
List<Map<String, Integer>> list = new ArrayList<>();
while ((str = bufferedReader.readLine()) != null) {
if (str.contains("xmin")) {
Map<String, Integer> map = new HashMap();
int indexOf = str.indexOf(">");
int indexOf2 = str.indexOf("</");
String substring = str.substring(indexOf + 1, indexOf2);
map.put("xmin", Integer.valueOf(substring));
list.add(map);
}
if (str.contains("ymin")) {
Map<String, Integer> map = list.get(flag);
int indexOf = str.indexOf(">");
int indexOf2 = str.indexOf("</");
String substring = str.substring(indexOf + 1, indexOf2);
map.put("ymin", Integer.valueOf(substring));
list.set(flag, map);
}
if (str.contains("xmax")) {
Map<String, Integer> map = list.get(flag);
int indexOf = str.indexOf(">");
int indexOf2 = str.indexOf("</");
String substring = str.substring(indexOf + 1, indexOf2);
map.put("xmax", Integer.valueOf(substring));
list.set(flag, map);
}
if (str.contains("ymax")) {
Map<String, Integer> map = list.get(flag);
int indexOf = str.indexOf(">");
int indexOf2 = str.indexOf("</");
String substring = str.substring(indexOf + 1, indexOf2);
map.put("ymax", Integer.valueOf(substring));
list.set(flag, map);
Bean.setContentSize(list);
flag++;
}
}
} catch (Exception e) {
e.printStackTrace();
}
listBean.add(Bean);
}
}
/*** *******************************************************************************************/
int lastIndexOf = path.lastIndexOf("\\");
String lastPath = path.substring(0, lastIndexOf);
File lastFile = new File(lastPath);
File[] lastFileList = lastFile.listFiles();
for (int i = 0; i < lastFileList.length; i++) {
if (lastFileList[i].isFile()) {
File imgFile = lastFileList[i];
String name = imgFile.getName().substring(0, imgFile.getName().lastIndexOf("."));
for (标注实体 bean : listBean) {
String fineName = bean.getName().substring(0, bean.getName().lastIndexOf("."));
if (name.equals(fineName)) {
BufferedImage bufImage = ImageIO.read(imgFile);
List<Map<String, Integer>> contentSize = bean.getContentSize();
if (contentSize != null && contentSize.size() != 0){
for (int i1 = 0; i1 < contentSize.size(); i1++) {
Map<String, Integer> map = contentSize.get(i1);
try {
File folder = new File(lastPath + File.separator + "cut" + File.separator );
if (!folder.exists()){
folder.mkdirs();
}
// 获取图片的宽高
final int width = bufImage.getWidth();
final int height = bufImage.getHeight();
Integer xmin = map.get("xmin")<0?0:map.get("xmin");
Integer ymin = map.get("ymin")<0?0:map.get("ymin");
Integer xmax = map.get("xmax")>width?width:map.get("xmax");
Integer ymax = map.get("ymax")>height?height:map.get("ymax");
Integer x = xmax - xmin;
Integer y = ymax - ymin;
/**
* 裁剪图片, 参数说明:
* x: 裁剪起点横坐标
* y: 裁剪起点纵坐标
* w: 需要裁剪的宽度
* h: 需要裁剪的高度
*/
// bufImage.getSubimage (int x, int y, int w, int h);
BufferedImage subimage = bufImage.getSubimage(xmin, ymin, x, y);
String picName = bean.getName().substring(bean.getName().lastIndexOf("/") + 1);
byte[] imageData = downloadImage(imgFile);
String picFormat = getFormatName(picName, imageData);
// System.out.println("fileName: " + picName + ", fileFormat: " + picFormat);
ImageIO.write(subimage, picFormat, new File(lastPath+File.separator+"cut"+File.separator+name+"_"+i1+".jpg"));
}catch (Exception e){
System.out.println(bean.getName());
}
}
break;
}
}
}
}
}
}
/**
* 根据图片名来获取图片格式
* @param imageName 图片名
* @return 图片格式
*/
private static String getFormatName(String imageName) {
String extension = Files.getFileExtension(imageName);
if (StringUtils.isBlank(extension)) {
return FileFormatEnum.JPG.getValue();
}
for (FileFormatEnum fileFormatEnum : FileFormatEnum.values()) {
if (StringUtils.equalsIgnoreCase(fileFormatEnum.getValue(), extension)) {
return fileFormatEnum.getValue();
}
}
return FileFormatEnum.UNKNOWN.getValue();
}
/**
* 获取图片格式
* @param imageName 图片名
* @param imageBytes 图片字节码
* @return 图片格式
*/
private static String getFormatName(String imageName, byte[] imageBytes) {
// 根据图片字节码读取图片类型
FileFormatEnum formatName = getImageFormat(imageBytes);
if (formatName != FileFormatEnum.UNKNOWN) {
return formatName.getValue();
}
// 如果通过字节码没有取到图片类型,则根据文件名来判断
return getFormatName(imageName);
}
/**
* 读取图片格式
* @param imageBytes 图片字节码数组
* @return 图片格式
*/
private static FileFormatEnum getImageFormat(byte[] imageBytes) {
// 读取文件的前几个字节来判断图片格式
byte[] b = Arrays.copyOf(imageBytes, 4);
String type = bytesToHexString(b).toUpperCase();
for (FileFormatEnum FileFormatEnum : FileFormatEnum.values()) {
if (type.contains(FileFormatEnum.getCode())) {
return FileFormatEnum;
}
}
return FileFormatEnum.UNKNOWN;
}
/**
* 将要读取文件头信息的文件的byte数组转换成string类型表示
* @param src 要读取文件头信息的文件的byte数组
* @return 图片类型字符串
*/
private static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
}
HttpUtil
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.tomcat.util.http.fileupload.IOUtils;
public class HttpUtil {
public static byte[] downloadImage(File file) {
byte[] dataBuffer = null;
try {
InputStream input = new FileInputStream(file);
ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(input, output);
output.flush();
input.close();
dataBuffer = output.toByteArray();
output.close();
} catch (Exception var17) {
} finally {
}
return dataBuffer;
}
}
标注实体
import java.util.List;
import java.util.Map;
public class 标注实体 {
private String name;
private List<Map<String,Integer>> contentSize;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Map<String, Integer>> getContentSize() {
return contentSize;
}
public void setContentSize(List<Map<String, Integer>> contentSize) {
this.contentSize = contentSize;
}
}
public enum FileFormatEnum {
/**
* 文件格式枚举
*/
JPG("FFD8FF", "jpg"),
// JPEG("FFD8FFE0", "jpeg"),
PNG("89504E47", "png"),
GIF("47494638", "gif"),
BMP("424D", "bmp"),
TIF("49492A00", "tif"),
DWG("41433130", "dwg"),
PSD("38425053", "psd"),
RTF("7B5C727466", "rtf"),
XML("3C3F786D6C", "xml"),
HTML("68746D6C3E", "html"),
EML("44656C69766572792D646174653A", "eml"),
/**
* word or xls
*/
DOC("D0CF11E0", "doc"),
MDB("5374616E64617264204A", "mdb"),
PS("252150532D41646F6265", "ps"),
PDF("255044462D312E", "pdf"),
/**
* word or xlsx
*/
DOCX("504B0304", "docx"),
RAR("52617221", "rar"),
WAV("57415645", "wav"),
AVI("41564920", "avi"),
RM("2E524D46", "rm"),
MPG("000001B", "mpg"),
MOV("6D6F6F76", "mov"),
ASF("3026B2758E66CF11", "asf"),
MID("4D546864", "mid"),
GZ("1F8B08", "gz"),
EXE_DLL("4D5A9000", "exe/dll"),
TXT("75736167", "txt"),
UNKNOWN("000000", "unknown")
;
private String code;
private String value;
FileFormatEnum(String code ,String value){
this.code = code;
this.value = value;
}
public String getValue() {
return this.value;
}
public String getCode() {
return this.code;
}
}