zoukankan      html  css  js  c++  java
  • java处理图片 添加文字或图片水印并可生成缩略图

    ImageHelper.java

    package com.test1433;
    
    import java.awt.AlphaComposite;
        import java.awt.Color;
        import java.awt.Font;
        import java.awt.Graphics2D;
        import java.awt.Image;
        import java.awt.RenderingHints;
        import java.awt.geom.AffineTransform;
        import java.awt.image.BufferedImage;
        import java.awt.image.ColorModel;
        import java.awt.image.WritableRaster;
        import java.io.File;
        import java.io.FileOutputStream;
        import javax.imageio.ImageIO;
        import com.sun.image.codec.jpeg.JPEGCodec;
        import com.sun.image.codec.jpeg.JPEGImageEncoder;
         
        public class ImageHelper {
         
    /**
     * 生成缩略图 <br/>保存:ImageIO.write(BufferedImage, imgType[jpg/png/...], File);
     *
     * @param source
     *            原图片
     * @param width
     *            缩略图宽
     * @param height
     *            缩略图高
     * @param b
     *            是否等比缩放
     * */
    public static BufferedImage Thumb(BufferedImage source, int width,
            int height, boolean b) {
    // targetW,targetH分别表示目标长和宽
                    int type = source.getType();
                    BufferedImage target = null;
                    double sx = (double) width / source.getWidth();
                    double sy = (double) height / source.getHeight();
     
                    if (b) {
                            if (sx > sy) {
                                    sx = sy;
                                    width = (int) (sx * source.getWidth());
                            } else {
                                    sy = sx;
                                    height = (int) (sy * source.getHeight());
                            }
                    }
                     
                    if (type == BufferedImage.TYPE_CUSTOM) { // handmade
            ColorModel cm = source.getColorModel();
            WritableRaster raster = cm.createCompatibleWritableRaster(width,
                            height);
            boolean alphaPremultiplied = cm.isAlphaPremultiplied();
            target = new BufferedImage(cm, raster, alphaPremultiplied, null);
                    } else
            target = new BufferedImage(width, height, type);
                    Graphics2D g = target.createGraphics();
    // smoother than exlax:
            g.setRenderingHint(RenderingHints.KEY_RENDERING,
                            RenderingHints.VALUE_RENDER_QUALITY);
            g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
            g.dispose();
            return target;
            }
     
            /**
     * 图片水印
     *
     * @param imgPath
     *            待处理图片
     * @param markPath
     *            水印图片
     * @param x
     *            水印位于图片左上角的 x 坐标值
     * @param y
     *            水印位于图片左上角的 y 坐标值
     * @param alpha
     *            水印透明度 0.1f ~ 1.0f
     * */
    public static void waterMark(String imgPath, String markPath, int x, int y,
                    float alpha) {
            try {
            // 加载待处理图片文件
                 Image img = ImageIO.read(new File(imgPath));
     
                 BufferedImage image = new BufferedImage(img.getWidth(null), img
                                            .getHeight(null), BufferedImage.TYPE_INT_RGB);
                 Graphics2D g = image.createGraphics();
                 g.drawImage(img, 0, 0, null);
     
                 // 加载水印图片文件
                 Image src_biao = ImageIO.read(new File(markPath));
                 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                         alpha));
                 g.drawImage(src_biao, x, y, null);
                            g.dispose();
             // 保存处理后的文件
            FileOutputStream out = new FileOutputStream(imgPath);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }
     
            /**
     * 文字水印
     *
     * @param imgPath
     *            待处理图片
     * @param text
     *            水印文字
     * @param font
     *            水印字体信息
     * @param color
     *            水印字体颜色
     * @param x
     *            水印位于图片左上角的 x 坐标值
     * @param y
     *            水印位于图片左上角的 y 坐标值
     * @param alpha
     *            水印透明度 0.1f ~ 1.0f
     */
     
    public static void textMark(String imgPath, String text, Font font,
                    Color color, int x, int y, float alpha) {
            try {
                Font Dfont = (font == null) ? new Font("宋体", 20, 13) : font;
             
                Image img = ImageIO.read(new File(imgPath));
             
                BufferedImage image = new BufferedImage(img.getWidth(null), img
                                                    .getHeight(null), BufferedImage.TYPE_INT_RGB);
                Graphics2D g = image.createGraphics();
             
               g.drawImage(img, 0, 0, null);
               g.setColor(color);
               g.setFont(Dfont);
               g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                                                    alpha));
               g.drawString(text, x, y);
               g.dispose();
               FileOutputStream out = new FileOutputStream(imgPath);
               JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
               encoder.encode(image);
               out.close();
              } catch (Exception e) {
                    System.out.println(e);
              }
            }
        }

    测试代码

    package com.test1433;
    
    import java.awt.Color;
    import java.awt.Font;
    
    public class TestPic {
        
        public static void main(String[] args) {
            Font font = new Font("宋体",50,60);
            Color color = new Color(0,0,0);
            ImageHelper.textMark("c://2012.jpg","http://www.baidu.com",font,color,20,40,1f);
        }
     
    }
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/jijm123/p/13874762.html
Copyright © 2011-2022 走看看