libyuv 水印
时间: 2023-07-24 09:47:08 浏览: 90
要给图片添加水印,可以使用 libyuv 库和 OpenCV 库来实现。
首先,使用 OpenCV 加载原始图片和水印图片,并将其转换为 YUV 格式。然后,使用 libyuv 库将两个 YUV 图像叠加在一起。最后,将叠加后的 YUV 图像转换回 RGB 格式,保存为一张新的图片。
以下是示例代码:
```c++
#include <opencv2/opencv.hpp>
#include "libyuv.h"
using namespace cv;
int main()
{
// 加载原始图片和水印图片
Mat src = imread("input.jpg");
Mat watermark = imread("watermark.png");
// 将图片转换为 YUV 格式
Mat src_yuv, watermark_yuv;
cvtColor(src, src_yuv, COLOR_BGR2YUV);
cvtColor(watermark, watermark_yuv, COLOR_BGR2YUV);
// 获取图片尺寸
int width = src.cols;
int height = src.rows;
// 将水印图片缩放到与原始图片相同的大小
resize(watermark_yuv, watermark_yuv, Size(width, height));
// 获取 Y、U、V 分量的指针
uint8_t* src_y = src_yuv.data;
uint8_t* src_u = src_y + width * height;
uint8_t* src_v = src_u + width * height / 4;
uint8_t* watermark_y = watermark_yuv.data;
uint8_t* watermark_u = watermark_y + width * height;
uint8_t* watermark_v = watermark_u + width * height / 4;
// 将两张 YUV 图像叠加在一起
libyuv::MixYuv(src_y, width, src_u, width / 2, src_v, width / 2, watermark_y, width, watermark_u, width / 2, watermark_v, width / 2, width, height, 128);
// 将叠加后的 YUV 图像转换为 RGB 格式
Mat result;
cvtColor(src_yuv, result, COLOR_YUV2BGR);
// 保存结果图片
imwrite("output.jpg", result);
return 0;
}
```
在上述代码中,我们使用了 libyuv 库的 MixYuv 函数来将两张 YUV 图像叠加在一起。该函数接受 Y、U、V 分量的指针、图片宽度和高度、以及混合比例作为参数。最后,我们将叠加后的 YUV 图像转换回 RGB 格式,并保存为一张新的图片。