使用CxImage添加水印可以通过以下几种方法实现:
以下是一个使用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添加水印的几种方法,您可以根据自己的需求选择合适的方法进行操作。