实际问题:水印平铺,以二维规则小图形对大图形进行填充问题解决

实际问题:

在功能开发中,我们会遇到有关水印的需求,eg:实名认证,在身份证上打上水印等等。

解决思路:

利用文章 二维规则小图形对大图形进行填充,求出最左上坐标 来解决实际问题。
水印图片可以看做是小图形,加水印的图片为大图

解决方案

利用Java Graphics2D类来进行图片叠加。附上各种水印位置的工具类

/**
     * 添加图片水印
     * 
     * @param srcBufferedImage
     *            需要处理的源图片
     * @param destFile
     *            处理后的图片文件
     * @param watermarkFile
     *            水印图片文件
     * @param watermarkPosition  枚举 水印位置
     * 
     * @param alpha 透明度
     */
    public static void imageWatermark(BufferedImage srcBufferedImage,
            File destFile, File watermarkFile,
            WatermarkPosition watermarkPosition, int alpha) {
        try {
            int srcWidth = srcBufferedImage.getWidth();
            int srcHeight = srcBufferedImage.getHeight();
            BufferedImage destBufferedImage = new BufferedImage(srcWidth,
                    srcHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = destBufferedImage.createGraphics();
            graphics2D.setBackground(Color.WHITE);
            graphics2D.clearRect(0, 0, srcWidth, srcHeight);
            graphics2D.drawImage(srcBufferedImage.getScaledInstance(srcWidth,
                    srcHeight, Image.SCALE_SMOOTH), 0, 0, null);

            if (watermarkFile != null && watermarkFile.exists()
                    && watermarkPosition != null
                    && watermarkPosition != WatermarkPosition.no) {
                BufferedImage watermarkBufferedImage = ImageIO
                        .read(watermarkFile);
                int watermarkImageWidth = watermarkBufferedImage.getWidth();
                int watermarkImageHeight = watermarkBufferedImage.getHeight();
                graphics2D.setComposite(AlphaComposite.getInstance(
                        AlphaComposite.SRC_ATOP, alpha / 100.0F));
                int x = 0;
                int y = 0;
                if (watermarkPosition == WatermarkPosition.topLeft) {
                    x = 0;
                    y = 0;
                } else if (watermarkPosition == WatermarkPosition.topRight) {
                    x = srcWidth - watermarkImageWidth;
                    y = 0;
                } else if (watermarkPosition == WatermarkPosition.center) {
                    x = (srcWidth - watermarkImageWidth) / 2;
                    y = (srcHeight - watermarkImageHeight) / 2;
                } else if (watermarkPosition == WatermarkPosition.bottomLeft) {
                    x = 0;
                    y = srcHeight - watermarkImageHeight;
                } else if (watermarkPosition == WatermarkPosition.bottomRight) {
                    x = srcWidth - watermarkImageWidth;
                    y = srcHeight - watermarkImageHeight;
                } else if (watermarkPosition == WatermarkPosition.repeat) {
                    x = 0;
                    y = 0;
                    int spacing = 100;
                    for (int i = 0; i < srcWidth; i += watermarkImageWidth
                            + spacing) {
                        for (int j = 0; j < srcHeight; j += watermarkImageHeight
                                + spacing) {
                            graphics2D.drawImage(watermarkBufferedImage, i, j,
                                    watermarkImageWidth, watermarkImageHeight,
                                    null);
                        }

                    }
                }
                graphics2D.drawImage(watermarkBufferedImage, x, y,
                        watermarkImageWidth, watermarkImageHeight, null);
            }

            ImageIO.write(destBufferedImage, "JPG", destFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

// 水印位置(无、左上、右上、居中、左下、右下,平铺)
    public enum WatermarkPosition {
        no, topLeft, topRight, center, bottomLeft, bottomRight,repeat
    }

猜你喜欢

转载自blog.csdn.net/sinat_25926481/article/details/78832645