之前文章java產生縮圖,
但清晰度不佳,又調整了一版,
清晰度變好,但檔案size也變大了~
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
...
public void change2SmallImg_h(String fromImgPath, String destImgPath, String imgType, int maxHeight) {
try {
File fiBig = new File(fromImgPath);
BufferedImage bis = ImageIO.read(fiBig);
//原?的高?
int w = bis.getWidth();
int h = bis.getHeight();
//?放
int nowHeight = maxHeight;
int nowWidth = (nowHeight * w) / h;
changeImg(fiBig, destImgPath, imgType, nowWidth, nowHeight);
} catch (Exception e) {
e.printStackTrace();
}
}
public void change2SmallImg_w(String fromImgPath, String destImgPath, String imgType, int maxWidth) {
try {
File fiBig = new File(fromImgPath);
BufferedImage bis = ImageIO.read(fiBig);
//原?的高?
int w = bis.getWidth();
int h = bis.getHeight();
//?放
int nowWidth = maxWidth;
int nowHeight = (nowWidth * h) / w;
changeImg(fiBig, destImgPath, imgType, nowWidth, nowHeight);
} catch (Exception e) {
e.printStackTrace();
}
}
private boolean changeImg(File fiBig, String destImgPath, String imgType, int nowWidth, int nowHeight) {
try {
if (imgType.compareToIgnoreCase("png") == 0 || imgType.compareToIgnoreCase("gif") == 0){
BufferedImage to= new BufferedImage(nowWidth, nowHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = to.createGraphics();
to = g2d.getDeviceConfiguration().createCompatibleImage(nowWidth, nowHeight, Transparency.TRANSLUCENT);
g2d.dispose();
g2d = to.createGraphics();
BufferedImage bis = ImageIO.read(fiBig);
Image from = bis.getScaledInstance(nowWidth, nowHeight, Image.SCALE_AREA_AVERAGING);
g2d.drawImage(from, 0, 0, null);
g2d.dispose();
ImageIO.write(to, imgType, new File(destImgPath));
} else {
BufferedImage tag = new BufferedImage(nowWidth, nowHeight, BufferedImage.TYPE_INT_RGB);
Image img = ImageIO.read(fiBig);
tag.getGraphics().drawImage(img.getScaledInstance(nowWidth, nowHeight, Image.SCALE_SMOOTH),
0, 0, null);
/* only JDK 8.0,若JDK8以下,只能用下面這一段
FileOutputStream out = new FileOutputStream(destImgPath);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
jep.setQuality(1f, true);
encoder.encode(tag, jep);
out.close();*/
// Image writer
JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix(imgType).next();
FileOutputStream fos = new FileOutputStream(destImgPath);
ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
imageWriter.setOutput(ios);
//and metadata
IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(tag), null);
int dpi = 96;
//new metadata
Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
for (int i = 0; i < jfif.getAttributes().getLength(); i++) {
Node attribute = jfif.getAttributes().item(i);
System.out.println(attribute.getNodeName() + "=" + attribute.getNodeValue());
}
jfif.setAttribute("Xdensity", Integer.toString(dpi));
jfif.setAttribute("Ydensity", Integer.toString(dpi));
imageMetaData.setFromTree("javax_imageio_jpeg_image_1.0", tree);
// new Compression
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(1.0f);
//new Write and clean up
imageWriter.write(imageMetaData, new IIOImage(tag, null, imageMetaData), jpegParams);
ios.close();
imageWriter.dispose();
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}