lexy

支持开源,尊重他人的劳动!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  17 随笔 :: 0 文章 :: 9 评论 :: 0 Trackbacks

贴一段 最近写的用来 给 给定目录下的图片 添加水印的代码。

WaterMark.java:


import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.FilenameFilter;
import java.io.FileOutputStream;
import java.util.Properties;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;

public class WaterMark {

    private List<File> filterFiles(String path, FilenameFilter filter, List<File> fileList) {
        if (new File(path).exists() && new File(path).isDirectory()) {
            File[] files = new File(path).listFiles(filter);
            fileList.addAll(Arrays.asList(files));

            File[] allFiles = new File(path).listFiles();
            for (File file : allFiles) {
                if (file.isDirectory())
                    filterFiles(file.getPath(), filter, fileList);
            }
        }
        return fileList;
    }

    private void drawWaterMark(File srcPicture, File logoPicture, String destPath, float logoPercent) {
        try {
            Image src = ImageIO.read(srcPicture);
            int width = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
            g.drawImage(src, 0, 0, width, height, null);

            Image src_logo = ImageIO.read(logoPicture);

            int width_src_logo = src_logo.getWidth(null);
            int heigth_src_logo = src_logo.getHeight(null);

            int width_logo = (int) (width * logoPercent);
            int height_logo = heigth_src_logo * width_logo / width_src_logo;

            g.drawImage(src_logo, (width - width_logo) / 2, (height - height_logo) / 2,
                    width_logo, height_logo, null);
            g.dispose();
            FileOutputStream out = new FileOutputStream(destPath + "\\" + srcPicture.getName());
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw() {
        try {
            Properties props = new Properties();
            props.load(WaterMark.class.getClassLoader().getResourceAsStream("system.properties"));
            FFilter filter = new FFilter(props.getProperty("extensions.pictures"));
            List<File> files = new ArrayList<File>();
            String srcPath = props.getProperty("path.pictures.src");
            files = filterFiles(srcPath, filter, files);
            File logoPic = new File(props.getProperty("path.picture.logo"));
            String destPath = props.getProperty("path.pictures.dest");
            float logoSize = Float.valueOf(props.getProperty("percent.picture.logo"));
            for (File pic : files) {
                String path = pic.getPath().substring(srcPath.length());
                path = path.substring(0, path.indexOf(pic.getName()));
                String newPath = destPath + path;
                if (!new File(newPath).exists())
                    new File(newPath).mkdirs();
                drawWaterMark(pic, logoPic, newPath, logoSize);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new WaterMark().draw();
    }
}

FFilter.java :

import java.io.FilenameFilter;
import java.io.File;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class FFilter implements FilenameFilter {
    private String regEx = "";

    public FFilter(String regEx) {
        this.regEx = regEx;
    }

    public boolean accept(File dir, String filename) {
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(filename);
        return m.find();
    }
}

system.properties:

#source pictures directory
path.pictures.src=C:\\Documents and Settings\\Lexy\\Desktop\\testPic
#destination pictures directory
path.pictures.dest=C:\\Documents and Settings\\Lexy\\Desktop\\destTestPicDest
#picture's extensions,space by "|"
extensions.pictures=.jpg
#path of the watermark logo
path.picture.logo=C:\\Documents and Settings\\Lexy\\Desktop\\logo.png
#the watermark percent of the pictures
percent.picture.logo=0.5

posted on 2008-04-01 17:28 lexy 阅读(696) 评论(1)  编辑  收藏

评论

# re: 给图片添加水印的JAVA实现 2008-04-12 10:49 豆抓搜索
找了好长时间了,哈谢啦.http://www.douzhua.com  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问