简介
本程序主要实现对图片添加水印的功能,在图片上呈现出“水印.bmp”中的图像内容的水印。此外,程序可以进行水印位置放置,水印旋转,以及超出图片部分舍去。
设计
本程序主要通过二至四个参数,两个内外循环对图像进行从左到右再从下至上的查找、计算、赋值的工作,涉及直角坐标的X,Y在水平和垂直方向上的平移、直角坐标系中X,Y旋转公式计算,以及极坐标公式计算。
就如在左上角加水印是直角坐标平移:positionx=10+xmove,X轴正方向是从10像素开始即可向左向右偏移xmove参量,当然,向左平移大于10个参量时,就会有超出部分,这部分会不纳入增加透明度公式的计算赋值,而未超出部分,即长在图像宽度(getWidth())-水印图像宽度(path2.getWidth())到0之间(包括0),高在图像高度(getHeight())-水印图像高度(path2.getHeight())到0之间(包括0),以R值为例的加水印:bmpInfo->image[i][j].R = (255 * 1.5) + bmpInfo->image[i][j].R / 2,B、G皆以此公式赋值。
对于斜置水印,一种是将整体水印图像进行旋转,先对水印图像每个像素点RGB信息进行(以水印图像从左下至右上的对角线为起始)旋转的直角坐标计算公式赋值:
- 角度转弧度公式:angle = angle / 180 * PI;
- 水印图像旋转后的X位置:x = int(ncos(angle) - msin(angle));
- 水印图像旋转后的Y位置:y = int(mcos(angle) + nsin(angle)),最后在图像正中各减水印长宽的1/2位置,旋转并放置图像以及相应的偏移操作:x+=j;y+=i,可实现平面图像的旋转效果。
另一种是将水印图像内的文字坐标信息进行(以X轴正半轴为起始)旋转
- 极坐标计算公式:angle = angle / 180 * PI;
- 水印图像旋转后的X位置:x =int( sqrt((nn + mm))*cos(angle));
- 水印图像旋转后的Y位置:y = int(sqrt((nn + mm))*sin(angle)),最后在正中放置图像以及相应的偏移操作:x+=j;y+=i,当输入-45~0度时,会有一定立体效果。同样两种旋转对超出部分不会纳入计算赋值。
效果
- 立体效果

- 平面效果
略 - 普通效果
略
核心代码
#include <cmath>
#define PI 3.14159265358979
void WaterMark(BMP &path2) {
//位置,水印定义初始位置,偏移量,水印图像高宽信息,效果
int position, positionx = getWidth(), positiony = getHeight(), xmove,ymove,h=path2.getHeight(),w=path2.getWidth(),perform;
double angle;//角度
while (1) {
cout << "\t\t请选择水印位置" << endl;
cout << "\t1.左上角\t2.右上角\n\n\t3.左下角\t4.右下角\n\n\t5.正中\t\t6.斜置" << endl << "请输入:";
cin >> position;
if (position > 0 && position < 7) {
cout << "请输入水印水平偏移量:";
cin >> xmove;
cout << "请输入水印垂直偏移量:";
cin >> ymove;
}
if (position == 1) {
positionx = 10+xmove;
positiony = positiony - h - 10+ymove;
}
else if (position == 2) {
positionx = positionx - w -10+xmove

本文介绍了一种程序,它实现了对图片添加自定义水印的功能,支持不同位置放置、旋转,并处理超出边界的情况。核心代码展示了如何根据用户选择调整水印位置和进行旋转操作,以实现立体和平面效果。
最低0.47元/天 解锁文章
4868

被折叠的 条评论
为什么被折叠?



