debian

如何用cxImage添加水印

小樊
43
2025-06-15 23:57:43
栏目: 编程语言

使用CxImage添加水印可以通过以下几种方法实现:

使用CxImage C++类库添加文字水印

以下是一个使用CxImage C++类库在图片上添加文字水印的示例代码:

#include "ximage.h"

void AddWatermarkWithText(CxImage &image, const CString &filename, const CString &text, int x, int y, const CXTEXTINFO &textInfo) {
    CxImage imagesy;
    if (!imagesy.Load(filename, CXIMAGE_FORMAT_JPG)) {
        return;
    }
    if (imagesy.IsValid()) {
        imagesy.DrawStringEx(x, y, &textInfo);
        imagesy.Save("C:\\z2_sy.jpg", CXIMAGE_FORMAT_JPG);
    }
}

int main() {
    CxImage::CXTEXTINFO textword;
    textword.lfont.lfFaceName = "Times New Roman";
    textword.lfont.lfCharSet = GB2312_CHARSET;
    textword.lfont.lfWeight = 8;
    textword.lfont.lfItalic = 0;
    textword.lfont.lfUnderline = 0;
    textword.fcolor = RGB(255, 255, 160); // 水印文字颜色
    textword.bcolor = RGB(0, 80, 160); // 水印背景颜色
    textword.opaque = 1; // 背景
    textword.b_opacity = (float)(0) / (float)100; // 透明度
    textword.b_round = (BYTE)10; // 四舍五入为背景矩形半径
    textword.smooth = (BYTE)1; // 平滑选项的文本
    textword.text = "水印文字"; // 水印文字内容

    AddWatermarkWithText(imagesy, "C:\\z2.jpg", "水印文字", 100, 100, textword);
    return 0;
}

使用在线工具添加水印

可以使用一些在线工具来为图片添加水印,例如提到的67tool网站,它提供了批量加水印、图片编辑等功能。

使用其他编程语言库添加水印

from PIL import Image, ImageDraw, ImageFont

def add_watermark(input_image_path, watermark_image_path, output_image_path, position=(0.5, 0.5), opacity=0.5):
    base_image = Image.open(input_image_path).convert("RGBA")
    watermark = Image.open(watermark_image_path).convert("RGBA")
    base_width, base_height = base_image.size
    watermark_width, watermark_height = watermark.size
    left = int(base_width * position[0] - watermark_width / 2)
    top = int(base_height * position[1] - watermark_height / 2)
    right = min(base_width, left + watermark_width)
    bottom = min(base_height, top + watermark_height)
    watermark = watermark.resize((right - left, bottom - top), Image.LANCZOS)
    watermark_rgba = Image.new('RGBA', watermark.size, (255, 255, 255, int(255 * opacity)))
    watermark_rgba.alpha_composite(watermark)
    base_image.paste(watermark_rgba, (left, top), watermark_rgba)
    base_image.save(output_image_path)

# 使用示例
add_watermark('1.png', 'te.png', 'output_with_watermark.png')
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;

public class WaterMarkUtils {
    public static void addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent, Color markContentColor, Font font) {
        try {
            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            BufferedImage bufImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImg.getWidth(), srcImg.getHeight(), null);
            g.setColor(markContentColor);
            g.setFont(font);
            int x = srcImg.getWidth() - 2 * getWatermarkLength(waterMarkContent, g);
            int y = srcImg.getHeight() - 2 * getWatermarkLength(waterMarkContent, g);
            g.drawString(waterMarkContent, x, y);
            g.dispose();
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

    public static void main(String[] args) {
        Font font = new Font("微软雅黑", Font.PLAIN, 45);
        String srcImgPath = "F:\\nice.jpg";
        String tarImgPath = "F:\\img\\cc.jpg";
        String waterMarkContent = "水印内容";
        Color color = new Color(0, 0, 0, 255);
        addWaterMark(srcImgPath, tarImgPath, waterMarkContent, color, font);
    }
}

以上是使用CxImage添加水印的几种方法,您可以根据自己的需求选择合适的方法进行操作。

0
看了该问题的人还看了