我已经实现了tif格式图片转换和加水印,我的思路:先将tif格式转换为jpeg格式图片,并加水印,完成操作后再将加完水印的jpeg格式图片转换为tif格式。问题是当我加完水印转换为原tif格式的图片后,图片文件大小扩大了20倍,怎么操作不至于图片文件扩大这么多倍,因为我们本身选择tif就是看中了它文件小,便于上传下载?请大拿们赐教,不胜感激!import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.awt.image.renderable.RenderableImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.ParameterBlockJAI;
import javax.media.jai.PlanarImage;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGDecodeParam;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.TIFFDecodeParam;
import com.sun.media.jai.codec.TIFFEncodeParam;public class ImageWaterMark {
/**
* 图片类型-JPEG
*/
public final static int IMG_TYPE_JPEG = 0; /**
* 图片类型-TIFF
*/
public final static int IMG_TYPE_TIFF = 1; /**
* 转换图片文件格式为TIFF
* @param srcFile File 要转换格式的原文件
* @param resFile File 转换格式后的目标文件
* @param preType int 原文件的格式,目前只支持JPEG格式-0
* @throws IOException 抛出IO异常
*/
public static void convertImageToTIFF(File srcFile,File resFile,int preType) throws IOException {
if(preType == IMG_TYPE_TIFF) {
System.out.println("Needn't to convert!");
return;
} InputStream fis = new FileInputStream(srcFile);
OutputStream fos = new FileOutputStream(resFile); TIFFEncodeParam encodeParam = new TIFFEncodeParam();
encodeParam.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE); switch(preType) {
case IMG_TYPE_JPEG:
JPEGDecodeParam decodeParam = new JPEGDecodeParam();
ImageDecoder decoder = ImageCodec.createImageDecoder("JPEG",fis,decodeParam);
RenderedImage image = decoder.decodeAsRenderedImage();
ImageEncoder encoder = ImageCodec.createImageEncoder("TIFF",fos,encodeParam);
encoder.encode(image);
break;
default:
break;
} fos.close();
fis.close();
} /**
* 把图片格式转换为JPEG格式
* @param srcFile File 要转换的原文件
* @param resFile File 转换后的目标文件
* @param preType int 原文件的类型,目前只支持TIFF格式-1
* @throws IOException 抛出IO异常
*/
public static void convertImageToJPEG(File srcFile,File resFile,int preType) throws IOException {
if(preType == IMG_TYPE_JPEG) {
System.out.println("Needn't to convert!");
return;
} InputStream fis = new FileInputStream(srcFile);
OutputStream fos = new FileOutputStream(resFile); JPEGEncodeParam encodeParam = new JPEGEncodeParam(); switch(preType) {
case IMG_TYPE_TIFF:
TIFFDecodeParam decodeParam = new TIFFDecodeParam();
decodeParam.setJPEGDecompressYCbCrToRGB(false); ImageDecoder decoder = ImageCodec.createImageDecoder("TIFF",fis,decodeParam);
RenderedImage image = decoder.decodeAsRenderedImage(); ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG",fos,encodeParam);
encoder.encode(image);
break;
default:
break;
} fos.close();
fis.close();
} /**
 * 添加图片水印
 *
 * @param file
 */
public static void waterMark(File file) {
try {
Image srcImage = ImageIO.read(file);
int width = srcImage.getWidth(null);
int height = srcImage.getHeight(null);
BufferedImage bImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D gh = bImage.createGraphics();
gh.drawImage(srcImage, 0, 0, width, height, null);
File waterFile = new File("d:\\a.jpeg");
Image waterImage = ImageIO.read(waterFile);
int waterWidth = waterImage.getWidth(null);
int waterHeight = waterImage.getHeight(null);
gh.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
0.5f));
gh.drawImage(waterImage, (width - waterWidth) / 2,
(height - waterHeight) / 2, waterWidth, waterHeight, null);
gh.dispose();
FileOutputStream fos = new FileOutputStream(file);
JPEGImageEncoder jie = JPEGCodec.createJPEGEncoder(fos);
jie.encode(bImage);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
} /**
 * 加字符串水印
 *
 * @param file
 * @param str
 */
public static void waterMarkStr(File file, String str) {
try {
if (!file.exists()) {
file.createNewFile();
}
// 创建图片流
FileInputStream fis = new FileInputStream(file);
// 创建一个Image对象并以原图像流进行填充
Image image = ImageIO.read(fis);
int width = image.getWidth(null);
int height = image.getHeight(null);
// 创建一个图像操作容器
BufferedImage bImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 创建绘画环境
Graphics2D gh = bImage.createGraphics();
gh.drawImage(image, 0, 0, width, height, null);
// 设置字体
gh.setFont(new Font("宋体", Font.BOLD, 28));
// 设置颜色
gh.setColor(Color.RED);
// 设置透明度
gh.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
0.5f));
// 向BufferedImage写入字串,设置水印的位置
gh.drawString(str, width / 3, height / 3);
// 使更改生效
gh.dispose();
// 创建文件输出对象
FileOutputStream fos = new FileOutputStream(file);
// 创建按JPEG编码对象
JPEGImageEncoder jie = JPEGCodec.createJPEGEncoder(fos);
// 对BufferedImage进行JPEG编码
jie.encode(bImage);
// 关闭输出流
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
} public  static boolean  smallpicture(String   src,String   dest,int   w,int   h)
    {
        try
        {
            ParameterBlockJAI   loadPB   =   new   ParameterBlockJAI("fileload");
            loadPB.setParameter("d.jpeg",src);
            PlanarImage   source   =   JAI.create( "fileload",loadPB);
            int   orinWidth   =   source.getWidth();
            int   orinHeigth   =   source.getHeight();            int   newHeigth   =   orinHeigth   *   w/orinWidth;
            ParameterBlock   pb   =   new   ParameterBlock();
            pb.addSource(source);
            RenderableImage   ren   =   JAI.createRenderable( "renderable ",pb);
            PlanarImage   dst   =   (PlanarImage)ren.createScaledRendering(w,newHeigth,null);
            File   fout   =   new   File(dest);
            FileOutputStream   out   =   new   FileOutputStream(fout);
            JPEGEncodeParam   param   =   new   JPEGEncodeParam();
            param.setQuality(0.70f);//设置图片质量
            //这里你可以选择不同的图片编码,不过gif因为版权问题要压缩成png
            ImageEncoder   encoder   =   ImageCodec.createImageEncoder( "JPEG ",out,param);
            encoder.encode(dst);
            out.close();
            return   true;
        }
        catch   (Exception   e)
        {
            e.printStackTrace();
            return   false;
        }
    }
public static void main(String[] args) {
try {
//1.读取tif格式的文件,将文件转换为jpeg格式
File srcFile = new File("d:\\a.tif");
File recfile = new File("d:\\a.jpeg");
File file = new File("d:\\c.tif");
if (!srcFile.exists()) {
srcFile.createNewFile();
  }
if(!recfile.exists()){
recfile.createNewFile();
}
convertImageToJPEG(srcFile,recfile,IMG_TYPE_TIFF);
//2.给转换的jpeg文件加水印
waterMarkStr(recfile,"添加成功123");
//3.将加过水印后的jpeg文件转换为tif格式的
convertImageToTIFF(recfile,file,IMG_TYPE_JPEG); //4.将生成的临时的jpeg文件删掉
// recfile.delete();
} catch (IOException e) {
e.printStackTrace();
}
/* try {
File file = new File("d:\\a.jpg");
if (!file.exists()) {
file.createNewFile();
}
ImageWaterMark.waterMarkStr(file, "你好  2011-000051-15");
// ImageWaterMark.waterMark(file);
} catch (IOException e) {
e.printStackTrace();
}*/
}
}