通過對圖片重繪,達到圖片縮放、壓縮編碼轉換功能。
Java代碼
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
/**
*
* @author 梁棟
* @version 1.0
* @since 1.0
*/
public abstract class ImageUtils {
/**
* 縮放圖片
*
* @param width
* 輸出寬度
* @param height
* 輸出高度
* @param input
* 輸入流
* @param output
* 輸出流
* @param format
* 輸出格式
* @return
* @throws Exception
*/
public static boolean convert(int width, int height, InputStream input,
OutputStream output, String format) throws Exception {
// 輸入
BufferedImage inputImage = ImageIO.read(input);
// 轉換
RenderedImage im = (RenderedImage) convert(height, height, inputImage);
// 輸 出
return ImageIO.write(im, format, output);
}
/**
* 轉換壓縮算法
*
* @param input
* 輸入文件
* @param output
* 輸出文件
* @return
* @throws Exception
*/
public static boolean convert(File input, File output) throws Exception {
// 輸入
BufferedImage inputImage = ImageIO.read(input);
// 轉換
int width = inputImage.getWidth ();
int height = inputImage.getHeight();
RenderedImage im = (RenderedImage) convert(width, height, inputImage);
String outputFilename = output.getName ();
String format = outputFilename.substring(outputFilename
.lastIndexOf('.') + 1);
// 輸出
return ImageIO.write(im, format, output);
}
/**
* 縮放圖片
*
* @param width
* 輸出寬度
* @param height
* 輸出高度
* @param input
* 輸入文件
* @param output
* 輸出文件
* @return
* @throws Exception
*/
public static boolean convert(int width, int height, File input, File output)
throws Exception {
// 輸入
BufferedImage inputImage = ImageIO.read(input);
// 轉換
RenderedImage im = (RenderedImage) convert(width, height, inputImage);
String outputFilename = output.getName();
String format = outputFilename.substring(outputFilename
.lastIndexOf('.') + 1);
// 輸出
return ImageIO.write(im, format, output);
}
/**
* 縮放圖片
*
* @param width
* 輸出寬度
* @param height
* 輸出 高度
* @param input
* 輸入路徑
* @param output
* 輸出路徑
* @return
* @throws Exception
*/
public static boolean convert(int width, int height, String inputPath,
String outputPath) throws Exception {
return convert(width, height, new File(inputPath), new File (outputPath));
}
/**
* 轉換
*
* @param width
* 輸出寬度
* @param height
* 輸出高度
* @param input
* BufferedImage
* @return BufferedImage
* @throws Exception
*/
private static BufferedImage convert(int width, int height,
BufferedImage input) throws Exception {
// 初始化輸出圖片
BufferedImage output = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 重新繪圖
Image image = input.getScaledInstance(output.getWidth(), output
.getHeight(), output.getType());
output.createGraphics().drawImage(image, null, null);
return output;
}
/**
* 等比縮放圖片
*
* @param width
* 輸出寬度
* @param height
* 輸出高度
* @param input
* 輸入流
* @param output
* 輸出流
* @return
* @throws Exception
*/
public static boolean equimultipleConvert(int width, int height,
String input, String output) throws Exception {
return equimultipleConvert(width, height, new File(input), new File (
output));
}
/**
* 等比縮放圖片
*
* @param width
* 輸出寬度
* @param height
* 輸出高度
* @param input
* 輸入流
* @param output
* 輸出流
* @return
*
* @throws Exception
*/
public static boolean equimultipleConvert(int width, int height,
File input, File output) throws Exception {
// 輸入
BufferedImage image = ImageIO.read(input);
// 重新核 算尺寸
if (image.getWidth() > 0 && image.getHeight() > 0) {
if ((image.getWidth() / image.getHeight()) >= (width / height)) {
if (image.getWidth() > width) {
height = (image.getHeight() * width) / image.getWidth();
} else {
width = image.getWidth ();
height = image.getHeight();
}
} else {
if (image.getHeight() > height) {
width = (image.getWidth() * height) / image.getHeight();
} else {
width = image.getWidth();
height = image.getHeight();
}
}
}
// 轉換 輸出
return convert(width, height, input, output);
}
}
給出一個簡單的測試類:
Java代碼
import org.junit.Test;
/**
*
* @author 梁棟
* @version 1.0
* @since 1.0
*/
public class ImageUtilsTest {
/**
* Test method for
* {@link org.zlex.common.image.ImageUtils#main(java.lang.String [])}.
*/
@Test
public void test() throws Exception {
System.out.println (ImageUtils.convert(1650, 1024, "c:\\1.png",
"c:\\1.png.jpg"));
System.out.println(ImageUtils.convert(400, 300, "c:\\1.jpg",
"c:\\1.jpg.jpg"));
System.out.println(ImageUtils.convert(400, 300, "c:\\1.jpg",
"c:\\1.jpg.png"));
System.out.println(ImageUtils.convert(50, 50, "c:\\1.jpg",
"c:\\1.jpg.gif"));
System.out.println(ImageUtils.convert(40, 30, "c:\\1.bmp",
"c:\\1.bmp.gif"));
System.out.println(ImageUtils
.convert (40, 30, "c:\\1.bmp", "c:\\1.jpeg"));
System.out.println (ImageUtils.equimultipleConvert(1600, 1400, new File(
"c:\\1.bmp"), new File ("c:\\1Equimultiple.jpeg")));
}
}