package
utils;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class Photo {
public static void reduceImg(OutputStream out, String path, int width, int height) {
try {
File srcfile = new File(path);
if ( ! srcfile.exists()) {
System.out.println( " 缩放图片文件不存在! " );
return ;
}
BufferedImage src = ImageIO.read(srcfile);
// 得到原始宽和高
int w = src.getWidth();
int h = src.getHeight();
double sx = ( double ) width / w;
double sy = ( double ) height / h;
if (sx < sy) {
sy = sx;
height = ( int ) (sy * h);
} else {
sx = sy;
width = ( int ) (sy * w);
}
System.out.println(String.format( " %s, %s " , w, h));
System.out.println(String.format( " %s, %s " , width, height));
BufferedImage source = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
source.getGraphics().drawImage(
src.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0 , 0 , null );
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(source);
param.setQuality(70f, true );
encoder.encode(source, param);
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* 根据图片路径 读取图片文件
*
* @param fileName
* @return
*/
public static BufferedImage readImage(String fileName) {
BufferedImage bi = null ;
try {
bi = ImageIO.read( new File(fileName));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return bi;
}
/**
* 生成新的图片文件
*
* @param im
* @param formatName
* @param fileName
* @return
*/
public static boolean writeImage(RenderedImage im, String formatName, String fileName) {
boolean result = false ;
try {
result = ImageIO.write(im, formatName, new File(fileName));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return result;
}
/**
* 转换图片格式 到 jpg
*
* @param im
* @param fileName
* @return
*/
public static boolean writeJPEGImage(RenderedImage im, String fileName) {
return writeImage(im, " JPEG " , fileName);
}
/**
* 转换图片格式 到 gif 不知到好用不
*
* @param im
* @param fileName
* @return
*/
public static boolean writeGIFImage(RenderedImage im, String fileName) {
return writeImage(im, " GIF " , fileName);
}
public static boolean writePNGImage(RenderedImage im, String fileName) {
return writeImage(im, " PNG " , fileName);
}
public static boolean writeBMPImage(RenderedImage im, String fileName) {
return writeImage(im, " BMP " , fileName);
}
}
调用:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class Photo {
public static void reduceImg(OutputStream out, String path, int width, int height) {
try {
File srcfile = new File(path);
if ( ! srcfile.exists()) {
System.out.println( " 缩放图片文件不存在! " );
return ;
}
BufferedImage src = ImageIO.read(srcfile);
// 得到原始宽和高
int w = src.getWidth();
int h = src.getHeight();
double sx = ( double ) width / w;
double sy = ( double ) height / h;
if (sx < sy) {
sy = sx;
height = ( int ) (sy * h);
} else {
sx = sy;
width = ( int ) (sy * w);
}
System.out.println(String.format( " %s, %s " , w, h));
System.out.println(String.format( " %s, %s " , width, height));
BufferedImage source = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
source.getGraphics().drawImage(
src.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0 , 0 , null );
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(source);
param.setQuality(70f, true );
encoder.encode(source, param);
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* 根据图片路径 读取图片文件
*
* @param fileName
* @return
*/
public static BufferedImage readImage(String fileName) {
BufferedImage bi = null ;
try {
bi = ImageIO.read( new File(fileName));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return bi;
}
/**
* 生成新的图片文件
*
* @param im
* @param formatName
* @param fileName
* @return
*/
public static boolean writeImage(RenderedImage im, String formatName, String fileName) {
boolean result = false ;
try {
result = ImageIO.write(im, formatName, new File(fileName));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return result;
}
/**
* 转换图片格式 到 jpg
*
* @param im
* @param fileName
* @return
*/
public static boolean writeJPEGImage(RenderedImage im, String fileName) {
return writeImage(im, " JPEG " , fileName);
}
/**
* 转换图片格式 到 gif 不知到好用不
*
* @param im
* @param fileName
* @return
*/
public static boolean writeGIFImage(RenderedImage im, String fileName) {
return writeImage(im, " GIF " , fileName);
}
public static boolean writePNGImage(RenderedImage im, String fileName) {
return writeImage(im, " PNG " , fileName);
}
public static boolean writeBMPImage(RenderedImage im, String fileName) {
return writeImage(im, " BMP " , fileName);
}
}
Code
<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="utils.Photo"%>
<%@ page import="java.io.OutputStream"%>
<%
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
String path = this.getServletContext().getRealPath("images/photo1.jpg");
OutputStream outputStream = response.getOutputStream();
Photo.reduceImg(outputStream, path, 300, 300);
outputStream.close();
out.clear();
out = pageContext.pushBody();
%>
<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="utils.Photo"%>
<%@ page import="java.io.OutputStream"%>
<%
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
String path = this.getServletContext().getRealPath("images/photo1.jpg");
OutputStream outputStream = response.getOutputStream();
Photo.reduceImg(outputStream, path, 300, 300);
outputStream.close();
out.clear();
out = pageContext.pushBody();
%>