高分求解tif格式图片转换加水印问题?

hhxinghuo 2011-04-20 03:56:03
我已经实现了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();
}*/
}
}
...全文
506 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
beannian 2011-04-20
  • 打赏
  • 举报
回复
选择tif就是看中了它文件小????????
不会吧,tif格式的图片是高清的好不好,jpg是经过压缩的,tif格式图片当然比jpg的大,而且大得多!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧