直接上干货
import lombok.extern.slf4j.Slf4j;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
InputStream ins = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
String tempName=fileList.get(index).getFilename();
String fileTyle=tempName.substring(tempName.lastIndexOf(".")).toUpperCase();
if( ".TIF".equals(fileTyle) ){
String suffix="jpg";
BufferedImage image = ImageIO.read(ins);
ins.close();
BufferedImage bufferedImage = convertImageFormat(image, tempName.substring(0,tempName.lastIndexOf(".")), suffix);
tempName=tempName.substring(0,tempName.lastIndexOf("."))+".jpg";
BufferedImage newimg = ImageZip.zipOneImage(bufferedImage, 400);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(newimg, suffix, baos);
ins=new ByteArrayInputStream(baos.toByteArray());
}
图像格式转换
public static BufferedImage convertImageFormat(BufferedImage image, String name,
String format) throws IOException {
BufferedImage convertedImage = null;
convertedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
convertedImage.createGraphics().drawImage(image, 0, 0, null);
return convertedImage;
}
public static BufferedImage zipOneImage(BufferedImage sourceFile, int kb) {
double targetSize = kb * 1024;
try {
byte[] bytes = imageToBytes(sourceFile);
log.debug(String.format("图片压缩前大小:[{%S}]", bytes.length));
while (bytes.length > targetSize) {
float reduceMultiple = 0.9f;
bytes = resizeImage(bytes, reduceMultiple);
}
BufferedImage newImage = bytesToBufferedImage(bytes);
return newImage;
} catch (IOException e) {
log.error("图片格式转换后压缩失败");
log.error(e.getMessage(),e);
return null;
}
}
public static byte[] resizeImage(byte[] srcImgData, float reduceMultiple) throws IOException {
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
int width = (int) (bi.getWidth() * reduceMultiple);
int height = (int) (bi.getHeight() * reduceMultiple);
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, "JPG", bOut);
return bOut.toByteArray();
}
private static BufferedImage bytesToBufferedImage(byte[] imageByte) {
ByteArrayInputStream in = new ByteArrayInputStream(imageByte);
BufferedImage image = null;
try {
image = ImageIO.read(in);
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
public static byte[] imageToBytes(BufferedImage bImage) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bImage, "jpg", out);
return out.toByteArray();
}
public static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) throws IOException {
Image resultingImage = originalImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_AREA_AVERAGING);
BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
outputImage.getGraphics().drawImage(resultingImage, 0, 0, null);
return outputImage;
}
public static BufferedImage resizeImage(BufferedImage originalImage, float reduceMultiple) throws IOException {
int width = (int) (originalImage.getWidth() * reduceMultiple);
int height = (int) (originalImage.getHeight() * reduceMultiple);
Image resultingImage = originalImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING);
BufferedImage outputImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
outputImage.getGraphics().drawImage(resultingImage, 0, 0, null);
return outputImage;
}