java 等比例壓縮圖片(背景不會成黑的)
阿新 • • 發佈:2019-01-03
class ImagesTool {
public static void img_change(String url,String name)
{
Tosmallerpic(url,new File(url+name),"_small",name,30,40,(float)0.7);
}
/**
*
* @param f 圖片所在的資料夾路徑
* @param file 圖片路徑
* @param ext 副檔名
* @param n 圖片名
* @param w 目標寬
* @param h 目標高
* @param per 百分比
*/
private static void Tosmallerpic(String f,File file,String ext,String n,int w,int h,float per){
Image src;
try {
src = javax.imageio.ImageIO.read(file); //構造Image物件
String img_midname = f+n.substring (0,n.indexOf("."))+ext+n.substring(n.indexOf("."));
int old_w = src.getWidth(null); //得到源圖寬
int old_h = src.getHeight(null);
int new_w = 0;
int new_h = 0; //得到源圖長
double w2 = (old_w*1.00)/(w*1.00);
double h2 = (old_h*1.00 )/(h*1.00);
//圖片跟據長寬留白,成一個正方形圖。
BufferedImage oldpic;
if(old_w>old_h)
{
oldpic = new BufferedImage(old_w,old_w,BufferedImage.TYPE_INT_RGB);
}else{if(old_w<old_h){
oldpic = new BufferedImage(old_h,old_h,BufferedImage.TYPE_INT_RGB);
}else{
oldpic = new BufferedImage(old_w,old_h,BufferedImage.TYPE_INT_RGB);
}
}
Graphics2D g = oldpic.createGraphics();
g.setColor(Color.white);
if(old_w>old_h)
{
g.fillRect(0, 0, old_w, old_w);
g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h, Color.white, null);
}else{
if(old_w<old_h){
g.fillRect(0,0,old_h,old_h);
g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h, Color.white, null);
}else{
//g.fillRect(0,0,old_h,old_h);
g.drawImage(src.getScaledInstance(old_w, old_h, Image.SCALE_SMOOTH), 0,0,null);
}
}
g.dispose();
src = oldpic;
//圖片調整為方形結束
if(old_w>w)
new_w = (int)Math.round(old_w/w2);
else
new_w = old_w;
if(old_h>h)
new_h = (int)Math.round(old_h/h2);//計算新圖長寬
else
new_h = old_h;
BufferedImage image_to_save = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
image_to_save.getGraphics().drawImage(src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,0,null);
FileOutputStream fos = new FileOutputStream(img_midname); //輸出到檔案流
//舊的使用 jpeg classes進行處理的方法
// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
// JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(image_to_save);
/* 壓縮質量 */
// jep.setQuality(per, true);
// encoder.encode(image_to_save, jep);
//新的方法
saveAsJPEG(100, image_to_save, per, fos);
fos.close();
} catch (IOException ex) {
//Logger.getLogger(Img_Middle.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* 以JPEG編碼儲存圖片
* @param dpi 解析度
* @param image_to_save 要處理的影象圖片
* @param JPEGcompression 壓縮比
* @param fos 檔案輸出流
* @throws IOException
*/
public static void saveAsJPEG(Integer dpi ,BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {
JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
imageWriter.setOutput(ios);
//and metadata
IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);
if(dpi != null && !dpi.equals("")){
//old metadata
//jpegEncodeParam.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
//jpegEncodeParam.setXDensity(dpi);
//jpegEncodeParam.setYDensity(dpi);
//new metadata
Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
jfif.setAttribute("Xdensity", Integer.toString(dpi) );
jfif.setAttribute("Ydensity", Integer.toString(dpi));
}
if(JPEGcompression >= 0 && JPEGcompression <= 1f){
//old compression
//jpegEncodeParam.setQuality(JPEGcompression,false);
// new Compression
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(JPEGcompression);
}
//old write and clean
//jpegEncoder.encode(image_to_save, jpegEncodeParam);
//new Write and clean up
imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
ios.close();
imageWriter.dispose();
}
}