最近使用一些util工具(图片压缩)时遇到一个问题,上网搜索一下发现很多解决方法,但尝试一些后发现只有以下方法才最好,同时把自己的代码也分享出来
一些老的Java代码在JDK1.7下编译会报错,比如这个:程序包com.sun.image.codec.jpeg不存在。
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGImageEncoder类是SUN公司私有类
一般出现在这样的代码段中:
FileOutputStream out = new FileOutputStream(dstName);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(dstImage);
改写成:
String formatName = dstName.substring(dstName.lastIndexOf(".") + 1);
//FileOutputStream out = new FileOutputStream(dstName);
//JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
//encoder.encode(dstImage);
ImageIO.write(dstImage, /*"GIF"*/ formatName /* format desired */ , new File(dstName) /* target */ );
都使用统一的ImageIO进行图像格式文件的读写,没有必要使用过时的实现类JPEGImageEncoder类。
以下为自己遇到com.sun.image.codec.jpeg不存在所使用的java类(已改正,复制即可使用)
图片压缩:
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class PicCompress {
// TODO Auto-generated constructor stub
public static void resizePNG(File file, String toFile, int outputWidth, int outputHeight, boolean proportion) {
try {
// File f2 = new File(fromFile);
// JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new
// FileInputStream(file));
// BufferedImage bi2 = decoder.decodeAsBufferedImage();
BufferedImage bi2 = ImageIO.read(file); // 以上两行解决此处"Unsupported Image Type"
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (proportion == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) bi2.getWidth(null)) / (double) outputWidth;
double rate2 = ((double) bi2.getHeight(null)) / (double) outputHeight;
// 根据缩放比率大的进行缩放控制
double rate = rate1 < rate2 ? rate1 : rate2;
newWidth = (int) (((double) bi2.getWidth(null)) / rate);
newHeight = (int) (((double) bi2.getHeight(null)) / rate);
} else {
newWidth = outputWidth; // 输出的图片宽度
newHeight = outputHeight; // 输出的图片高度
}
BufferedImage to = new BufferedImage(newWidth, newHeight,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = to.createGraphics();
to = g2d.getDeviceConfiguration().createCompatibleImage(newWidth, newHeight,
Transparency.OPAQUE);
g2d.dispose();
g2d = to.createGraphics();
Image from = bi2.getScaledInstance(newWidth, newHeight, bi2.SCALE_AREA_AVERAGING);
g2d.drawImage(from, 0, 0, null);
g2d.dispose();
ImageIO.write(to, "jpg", new File(toFile));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
System.out.println("Start");
resizePNG(new File("E:\\3.jpg"), "E:\\33.jpg", 960, 540, true);
System.out.println("OK");
}
}