Heim  >  Artikel  >  Java  >  Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen

Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen

王林
王林nach vorne
2021-03-12 11:34:553925Durchsuche

Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen

Wir sehen oft Wasserzeichen bestimmter Unternehmen oder Marken auf einigen Bildern oder Bildern. Können wir also selbst Wasserzeichen zu unseren Lieblingsbildern oder -dateien hinzufügen? Die Antwort ist natürlich kein Problem.

Werfen wir zunächst einen Blick auf Bildwasserzeichen:

------------------------------------------Bildwasserzeichen------- - --------------------

1. Textwasserzeichen hinzufügen

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

/**
 * 給图片添加文字水印
 * 
 * @author liqiang
 *
 */
public class WaterMarkUtils {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // 原图位置, 输出图片位置, 水印文字颜色, 水印文字
        new WaterMarkUtils().mark("C:/Users/liqiang/Desktop/图片/kdmt.jpg", "C:/Users/liqiang/Desktop/图片/kdmt1.jpg",
                Color.red, "圖片來源:XXX");
    }

    /**
     * 图片添加水印
     * 
     * @param srcImgPath
     *            需要添加水印的图片的路径
     * @param outImgPath
     *            添加水印后图片输出路径
     * @param markContentColor
     *            水印文字的颜色
     * @param waterMarkContent
     *            水印的文字
     */
    public void mark(String srcImgPath, String outImgPath, Color markContentColor, String waterMarkContent) {
        try {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            // Font font = new Font("Courier New", Font.PLAIN, 12);
            Font font = new Font("宋体", Font.PLAIN, 20);
            g.setColor(markContentColor); // 根据图片的背景设置水印颜色

            g.setFont(font);
            int x = srcImgWidth - getWatermarkLength(waterMarkContent, g) - 3;
            int y = srcImgHeight - 3;
            // int x = (srcImgWidth - getWatermarkLength(watermarkStr, g)) / 2;
            // int y = srcImgHeight / 2;
            g.drawString(waterMarkContent, x, y);
            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(outImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取水印文字总长度
     * 
     * @param waterMarkContent
     *            水印的文字
     * @param g
     * @return 水印文字总长度
     */
    public int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }
}

Ergebnis:

Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen

2. Bildwasserzeichen zu Bildern hinzufügen

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

/**
 * 給图片添加图片
 * 
 * @author liqiang
 *
 */
public class WaterMarkUtils {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String srcImgPath = "C:/Users/liqiang/Desktop/图片/kdmt.jpg";
        String iconPath = "C:/Users/liqiang/Desktop/图片/qlq.jpeg";
        String targerPath = "C:/Users/liqiang/Desktop/图片/qlq1.jpeg";
        String targerPath2 = "C:/Users/liqiang/Desktop/图片/qlq2.jpeg";
        // 给图片添加水印
        WaterMarkUtils.markImageByIcon(iconPath, srcImgPath, targerPath);
        // 给图片添加水印,水印旋转-45
        WaterMarkUtils.markImageByIcon(iconPath, srcImgPath, targerPath2, -45);

    }

    /**
     * 给图片添加水印
     * 
     * @param iconPath
     *            水印图片路径
     * @param srcImgPath
     *            源图片路径
     * @param targerPath
     *            目标图片路径
     */
    public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath) {
        markImageByIcon(iconPath, srcImgPath, targerPath, null);
    }

    /**
     * 给图片添加水印、可设置水印图片旋转角度
     * 
     * @param iconPath
     *            水印图片路径
     * @param srcImgPath
     *            源图片路径
     * @param targerPath
     *            目标图片路径
     * @param degree
     *            水印图片旋转角度
     */
    public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree) {
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(new File(srcImgPath));

            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),
                    BufferedImage.TYPE_INT_RGB);

            // 得到画笔对象
            // Graphics g= buffImg.getGraphics();
            Graphics2D g = buffImg.createGraphics();

            // 设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0,
                    0, null);

            if (null != degree) {
                // 设置水印旋转
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }

            // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);

            // 得到Image对象。
            Image img = imgIcon.getImage();

            float alpha = 0.5f; // 透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

            // 表示水印图片的位置
            g.drawImage(img, 150, 300, null);

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

            g.dispose();

            os = new FileOutputStream(targerPath);

            // 生成图片
            ImageIO.write(buffImg, "JPG", os);

            System.out.println("图片完成添加Icon印章。。。。。。");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Effektanzeige :

Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen

Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen

(Kostenloses Video-Tutorial: Java-Video-Tutorial)

------------------------------------------ ---- -PDF-Wasserzeichen (itext Wasserzeichen hinzufügen)-----------------------------

Textwasserzeichen und Bildwasserzeichen hinzufügen hier gleichzeitig in PDF umwandeln (Fügen Sie jeder Seite ein Textwasserzeichen und ein Bildwasserzeichen hinzu)

Abhängige Pakete:

<dependencies>
        <dependency>
            <groupid>com.lowagie</groupid>
            <artifactid>itextasian</artifactid>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupid>com.lowagie</groupid>
            <artifactid>itext</artifactid>
            <version>2.1.7</version>
        </dependency>
    </dependencies>

Spezifischer Code:

import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

public class TestWaterPrint {
    public static void main(String[] args) throws DocumentException, IOException {
        // 要输出的pdf文件
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("E:/abc.pdf")));
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        // 将pdf文件先加水印然后输出
        setWatermark(bos, "G:/1.pdf", format.format(cal.getTime()) + "  下载使用人:" + "测试user", 16);
    }

    /**
     * 
     * @param bos输出文件的位置
     * @param input
     *            原PDF位置
     * @param waterMarkName
     *            页脚添加水印
     * @param permission
     *            权限码
     * @throws DocumentException
     * @throws IOException
     */
    public static void setWatermark(BufferedOutputStream bos, String input, String waterMarkName, int permission)
            throws DocumentException, IOException {
        PdfReader reader = new PdfReader(input);
        PdfStamper stamper = new PdfStamper(reader, bos);
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
        PdfGState gs = new PdfGState();
        for (int i = 1; i <p>Effektanzeige: </p><p><img src="https://img.php.cn/upload/image/584/251/170/1615519483789827.png" title="1615519483789827.png" alt="Java implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen"></p><p>Ergänzung: Bezüglich der Verwendung von Schriftarten</p> <p>1. Verwenden Sie iTextAsian wurde persönlich auf Wirksamkeit getestet und verwendet itext automatisch. Die bereitgestellten Schriftarten sind ausreichend und können Chinesisch korrekt verarbeiten. </p><p><br>Ergänzung: Informationen zum Abrufen der Höhe und Breite der PDF-Seite und deren anschließende dynamische Positionierung, z. B. Implementierung von gekachelten Wasserzeichen entsprechend der Seitenbreite: </p><pre class="brush:php;toolbar:false">BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);

Ergebnisanzeige:


Ergänzung: Informationen zum Hinzufügen von iText-Wasserzeichen mit Schrägstellung Schriftart

Oben wird BaseFont verwendet und es können keine Stile hinzugefügt werden. Schriftart kann Stile hinzufügen, aber die setFontAndSize-Methode akzeptiert den Font-Parameter nicht. Wir können es also nur umgehen:

Zum Beispiel: Erzeugen Sie ein geneigtes Wasserzeichen in der unteren rechten Ecke jeder Seite

Das obige ist der detaillierte Inhalt vonJava implementiert das Hinzufügen von Bildwasserzeichen und Textwasserzeichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen