<pre name="code" class="java">package com.compress;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
public class ConvertPic{
public static void main(String[] args)
{
try {
//模拟输入流,JAVA自带无直接读取TIF格式图片的方法
BufferedImage buf = ImageIO.read(new File("/home/brn/Pictures/2.jpg"));
compressTif2Jpg(buf, 300, 600, (float)0);
// compressTif2Jpg(buf, 0.2, (float)0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 将Tif格式图片转为jpg格式输出,指定压缩比例
* @param inputBufImg
* @param ratio
* @param quality
* @return
*/
public static BufferedImage compressTif2Jpg(BufferedImage inputBufImg, double ratio, float quality) {
ByteArrayOutputStream out;
ImageWriter imgWriter;
ImageWriteParam imgWriteParams;
int width = inputBufImg.getWidth();
int height = inputBufImg.getHeight();
BufferedImage outBufImage;
if(ratio > 0) {
width = (int) (width * ratio);
height = (int) (height * ratio);
// 指定写图片的方式为 jpg
imgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
imgWriteParams = setImgWriteParams(quality);
outBufImage = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
try
{
out = new ByteArrayOutputStream();
imgWriter.reset();
// 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造
imgWriter.setOutput(ImageIO.createImageOutputStream(out));
// 调用write方法,就可以向输入流写图片
imgWriter.write(null, new IIOImage(inputBufImg, null, null), imgWriteParams);
Graphics g = outBufImage.getGraphics();
g.drawImage(inputBufImg, 0, 0, width, height, null);
g.dispose();
ImageIO.write(outBufImage, "jpg", out);
/*System.out.println("Height:" + outBufImage.getHeight());
System.out.println("Width:" + outBufImage.getWidth());
ImageIO.write(outBufImage, "JPEG", new File("/home/brn/Pictures/tempout.jpg"));*/
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
return outBufImage;
} else {
return null;
}
}
/**
* 将Tif格式图片转为jpg格式输出,指定图片宽高
* @param inputBufImg
* @param width
* @param height
* @param quality
* @return
*/
public static BufferedImage compressTif2Jpg(BufferedImage inputBufImg, int width, int height, float quality)
{
BufferedImage outBufImage;
ByteArrayOutputStream out;
ImageWriter imgWriter;
ImageWriteParam imgWriteParams;
if(width > 0 && height > 0) {
// 指定写图片的方式为 jpg
imgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
imgWriteParams = setImgWriteParams(quality);
outBufImage = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
try
{
out = new ByteArrayOutputStream();
imgWriter.reset();
// 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造
imgWriter.setOutput(ImageIO.createImageOutputStream(out));
// 调用write方法,就可以向输入流写图片
imgWriter.write(null, new IIOImage(inputBufImg, null, null), imgWriteParams);
Graphics g = outBufImage.getGraphics();
g.drawImage(inputBufImg, 0, 0, width, height, null);
g.dispose();
ImageIO.write(outBufImage, "jpg", out);
/*byte[] data = out.toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(data);
outBufImage = ImageIO.read(in);
out.flush();
out.close();*/
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
return outBufImage;
} else {
return null;
}
}
/**
* 设置压缩参数
* @param quality
* @return
*/
private static ImageWriteParam setImgWriteParams(float quality) {
ImageWriteParam imgWriteParams = new JPEGImageWriteParam(null);
// 要使用压缩,必须指定压缩方式为MODE_EXPLICIT
imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
// 这里指定压缩的程度,参数quality是取值0~1范围内
imgWriteParams.setCompressionQuality(quality);
imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
ColorModel colorModel = ColorModel.getRGBdefault();
// 指定压缩时使用的色彩模式
imgWriteParams.setDestinationType(new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));
return imgWriteParams;
}
}
tif转jpg
最新推荐文章于 2024-06-19 14:11:22 发布