272 lines
8.8 KiB
Plaintext
272 lines
8.8 KiB
Plaintext
package com.nationalelectric.greenH5.identityAuth.util;
|
||
|
||
import java.awt.Color;
|
||
import java.awt.Graphics;
|
||
import java.awt.Image;
|
||
import java.awt.image.BufferedImage;
|
||
import java.io.BufferedInputStream;
|
||
import java.io.ByteArrayInputStream;
|
||
import java.io.ByteArrayOutputStream;
|
||
import java.io.File;
|
||
import java.io.FileInputStream;
|
||
import java.io.FileOutputStream;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.io.OutputStream;
|
||
import java.util.Arrays;
|
||
import java.util.Base64;
|
||
|
||
import javax.imageio.ImageIO;
|
||
import javax.imageio.stream.FileImageOutputStream;
|
||
|
||
import com.sun.image.codec.jpeg.JPEGCodec;
|
||
import com.sun.image.codec.jpeg.JPEGImageEncoder;
|
||
|
||
import sun.misc.BASE64Decoder;
|
||
|
||
public class PhotoUtil {
|
||
|
||
/**
|
||
* base64转图片并保存到本地
|
||
* @param baseStr base64编码
|
||
* @param imagePath 图片保存路径
|
||
* @return
|
||
*/
|
||
public static boolean base64ChangeImage(String baseStr,String imagePath){
|
||
if (baseStr == null){
|
||
return false;
|
||
}
|
||
BASE64Decoder decoder = new BASE64Decoder();
|
||
try {
|
||
// 解密
|
||
byte[] b = decoder.decodeBuffer(baseStr);
|
||
// 处理数据
|
||
for (int i = 0; i < b.length; ++i) {
|
||
if (b[i] < 0) {
|
||
b[i] += 256;
|
||
}
|
||
}
|
||
OutputStream out = new FileOutputStream(imagePath);
|
||
out.write(b);
|
||
out.flush();
|
||
out.close();
|
||
return true;
|
||
} catch (Exception e) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 指定图片宽度和高度和压缩比例对图片进行压缩
|
||
*
|
||
* @param imgsrc
|
||
* 源图片地址
|
||
* @param imgdist
|
||
* 目标图片地址
|
||
* @param widthdist
|
||
* 压缩后图片的宽度
|
||
* @param heightdist
|
||
* 压缩后图片的高度
|
||
* @param rate
|
||
* 压缩的比例
|
||
*/
|
||
public static void reduceImg(String imgsrc, String imgdist, Float rate) {
|
||
int widthdist = 0;
|
||
int heightdist = 0;
|
||
try {
|
||
File srcfile = new File(imgsrc);
|
||
// 检查图片文件是否存在
|
||
if (!srcfile.exists()) {
|
||
System.out.println("文件不存在");
|
||
}
|
||
// 如果比例不为空则说明是按比例压缩
|
||
if (rate != null && rate > 0) {
|
||
//获得源图片的宽高存入数组中
|
||
int[] results = getImgWidthHeight(srcfile);
|
||
if (results == null || results[0] == 0 || results[1] == 0) {
|
||
return;
|
||
} else {
|
||
//按比例缩放或扩大图片大小,将浮点型转为整型
|
||
widthdist = (int) (results[0] * rate);
|
||
heightdist = (int) (results[1] * rate);
|
||
}
|
||
}
|
||
// 开始读取文件并进行压缩
|
||
Image src = ImageIO.read(srcfile);
|
||
|
||
// 构造一个类型为预定义图像类型之一的 BufferedImage
|
||
BufferedImage tag = new BufferedImage((int) widthdist, (int) heightdist, BufferedImage.TYPE_INT_RGB);
|
||
|
||
//绘制图像 getScaledInstance表示创建此图像的缩放版本,返回一个新的缩放版本Image,按指定的width,height呈现图像
|
||
//Image.SCALE_SMOOTH,选择图像平滑度比缩放速度具有更高优先级的图像缩放算法。
|
||
tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH), 0, 0, null);
|
||
|
||
//创建文件输出流
|
||
FileOutputStream out = new FileOutputStream(imgdist);
|
||
//将图片按JPEG压缩,保存到out中
|
||
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
|
||
encoder.encode(tag);
|
||
//关闭文件输出流
|
||
out.close();
|
||
if(srcfile.length()>10*1024){
|
||
reduceImg(imgsrc,imgdist,rate);
|
||
}
|
||
} catch (Exception ef) {
|
||
ef.printStackTrace();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取图片宽度和高度
|
||
*
|
||
* @param
|
||
* @return 返回图片的宽度
|
||
*/
|
||
public static int[] getImgWidthHeight(File file) {
|
||
InputStream is = null;
|
||
BufferedImage src = null;
|
||
int result[] = { 0, 0 };
|
||
try {
|
||
// 获得文件输入流
|
||
is = new FileInputStream(file);
|
||
// 从流里将图片写入缓冲图片区
|
||
src = ImageIO.read(is);
|
||
result[0] =src.getWidth(null); // 得到源图片宽
|
||
result[1] =src.getHeight(null);// 得到源图片高
|
||
is.close(); //关闭输入流
|
||
|
||
} catch (Exception ef) {
|
||
ef.printStackTrace();
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* @param path
|
||
* @return String
|
||
* @description 将文件转base64字符串
|
||
* @date 2018年3月20日
|
||
* @author changyl
|
||
* File转成编码成BASE64
|
||
*/
|
||
|
||
public static String fileToBase64(String path) {
|
||
String base64 = null;
|
||
InputStream in = null;
|
||
try {
|
||
File file = new File(path);
|
||
in = new FileInputStream(file);
|
||
byte[] bytes=new byte[(int)file.length()];
|
||
in.read(bytes);
|
||
base64 = Base64.getEncoder().encodeToString(bytes);
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
} finally {
|
||
if (in != null) {
|
||
try {
|
||
in.close();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
return base64;
|
||
}
|
||
public static byte[] getByteByPic(String imageUrl) throws IOException{
|
||
File imageFile = new File(imageUrl);
|
||
InputStream inStream = new FileInputStream(imageFile);
|
||
BufferedInputStream bis = new BufferedInputStream(inStream);
|
||
BufferedImage bm = ImageIO.read(bis);
|
||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||
String type = imageUrl.substring(imageUrl.length() - 3);
|
||
ImageIO.write(bm, type, bos);
|
||
bos.flush();
|
||
byte[] data = bos.toByteArray();
|
||
return data;
|
||
}
|
||
/**
|
||
* 将图片压缩到指定大小以内
|
||
*
|
||
* @param srcImgData 源图片数据
|
||
* @param maxSize 目的图片大小
|
||
* @return 压缩后的图片数据
|
||
*/
|
||
public static byte[] compressUnderSize(byte[] srcImgData, long maxSize) {
|
||
double scale = 0.9;
|
||
byte[] imgData = Arrays.copyOf(srcImgData, srcImgData.length);
|
||
|
||
if (imgData.length > maxSize) {
|
||
do {
|
||
try {
|
||
imgData = compress(imgData, scale);
|
||
|
||
} catch (IOException e) {
|
||
throw new IllegalStateException("压缩图片过程中出错,请及时联系管理员!", e);
|
||
}
|
||
|
||
} while (imgData.length > maxSize);
|
||
}
|
||
|
||
return imgData;
|
||
}
|
||
|
||
/**
|
||
* 按照 宽高 比例压缩
|
||
*
|
||
* @param imgIs 待压缩图片输入流
|
||
* @param scale 压缩刻度
|
||
* @param out 输出
|
||
* @return 压缩后图片数据
|
||
* @throws IOException 压缩图片过程中出错
|
||
*/
|
||
public static byte[] compress(byte[] srcImgData, double scale) throws IOException {
|
||
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
|
||
int width = (int) (bi.getWidth() * scale); // 源图宽度
|
||
int height = (int) (bi.getHeight() * scale); // 源图高度
|
||
|
||
Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
|
||
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
||
|
||
Graphics g = tag.getGraphics();
|
||
g.setColor(Color.RED);
|
||
g.drawImage(image, 0, 0, null); // 绘制处理后的图
|
||
g.dispose();
|
||
|
||
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
|
||
ImageIO.write(tag, "JPEG", bOut);
|
||
|
||
return bOut.toByteArray();
|
||
}
|
||
|
||
//byte数组到图片
|
||
public static void byte2image(byte[] data,String path){
|
||
if(data.length<3||path.equals("")) return;
|
||
try{
|
||
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
|
||
imageOutput.write(data, 0, data.length);
|
||
imageOutput.close();
|
||
System.out.println("Make Picture success,Please find image in " + path);
|
||
} catch(Exception ex) {
|
||
System.out.println("Exception: " + ex);
|
||
ex.printStackTrace();
|
||
}
|
||
}
|
||
public static void main(String[] args) throws IOException {
|
||
// PhotoUtil.reduceImg("C:\\Users\\Feb\\Desktop\\test.jpg", "C:\\Users\\Feb\\Desktop\\test1.jpg", 1f);
|
||
long timeStart = System.currentTimeMillis();
|
||
String imgLocalUrl = "C:\\Users\\Feb\\Desktop\\test.jpg";
|
||
|
||
byte[] imgBytes = getByteByPic(imgLocalUrl);
|
||
byte[] resultImg = compressUnderSize(imgBytes,10 * 1024);
|
||
byte2image(resultImg,"C:\\Users\\Feb\\Desktop\\test1.jpg");
|
||
long timeEnd = System.currentTimeMillis();
|
||
System.out.println("耗时:"+ (timeEnd - timeStart));
|
||
|
||
}
|
||
|
||
}
|