実際の問題:透かしを平らにし、2 Dルールの小さなグラフィックで大きなグラフィックを塗りつぶす問題解決

6106 ワード

実際の質問:
機能開発では、eg:実名認証、身分証明書に透かしを打つなど、透かしに関するニーズに直面します.
解決方法:
文章の2次元規則の小さい図形を利用して大きい図形に対して充填を行って、最も左上の座標を求めて実際の問題を解決します.透かし画像は小さな図形と見なすことができ、透かしを加えた画像は大きな図である.
ソリューション
Java Graphics 2 Dクラスを用いて画像の重ね合わせを行う.各種透かし位置付き工具類
/**
     *       
     * 
     * @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
    }