java 中的图片处理,都是得到图片的byte[],得到图片的byte[] ,就可以对这个图片进行随意操作了。
在前端传过来的图片主要是3种
1.传图片的base64 字符串,这个需要我们将这个字符串转为byte[]
if(imageStr.contains("image/jpeg")){
imageStr = imageStr.replaceAll("data:image/jpeg;base64,", "");
}else if(imageStr.contains("image/png")){
imageStr = imageStr.replaceAll("data:image/png;base64,", "");
}
Decoder decoder = Base64.getDecoder();
byte[] bytes = decoder.decode(imageStr);
2.传图片的file .(通过二进制的形式传到后台)这个时候,后台可以通过request的参数得到这个MutipartFile;
也可以通过@MultipartFile file直接接收到该对象。 其实质也是得到图片的byte[]
MultipartHttpServletRequest req =(MultipartHttpServletRequest)request;
MultipartFile multipartFile = req.getFile("image");
再取出MultipartFile 的byte[]
if (multipartFile != null) {
// 上传到oss
byte[] content = new byte[0];
try {
content = multipartFile.getBytes();
} catch (IOException e) {
log.error("e:{}",e);
}
}
3.传图片的网络url,通过http的方式得到一个图片的InputStream 再转为byte[]
/**
* 得到文件流
*
* @param url
* @return
*/
public static byte[] getFileStream(String url) {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 从输入流中获取数据
*
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
得到图片的byte[] ,就可以对这个图片进行随意操作了。
比如存储到本地路径,对文件进行压缩等。
存储到本地路径
String tempPath = "/opt/pic/temp.jpg";
try(OutputStream out=new FileOutputStream(tempPath);){
// content 是图片的byte[]
out.write(content);
out.flush();
}
对图片进行压缩:压缩到指定长宽,压缩到指定大小
/**
* 将图像压缩成指定大小
* @param content
* @param height
* @param width
* @throws Exception
**/
public byte[] cutImage(byte[] content,int height, int width ) {
ByteArrayInputStream intputStream = new ByteArrayInputStream(content);
ByteArrayOutputStream outputStream =new ByteArrayOutputStream(BYTE_BUFFER_SIZE);
try {
Thumbnails.of(intputStream).size(width, height).keepAspectRatio(false).toOutputStream(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
byte[] byteArray=outputStream.toByteArray();
return byteArray;
}
/**
* 根据指定大小压缩图片
*
* @param imageBytes 源图片字节数组
* @param desFileSize 指定图片大小,单位kb
* @return 压缩质量后的图片字节数组
*/
public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
return imageBytes;
}
long srcSize = imageBytes.length;
double accuracy = getAccuracy(srcSize / 1024);
try {
while (imageBytes.length > desFileSize * 1024) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream)
.scale(accuracy) // 传一个double类型的数字,缩放比例,大于1就是变大,小于1就是缩小
.outputQuality(accuracy) // 控制图片质量
.toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
}
} catch (Exception e) {
log.error("compressPicForScale e:{}",e);
}
return imageBytes;
}