c语言给bmp图片加水印
时间: 2023-07-03 08:13:05 浏览: 39
要给bmp图片加水印,可以使用以下步骤:
1. 打开bmp文件,读取文件头和像素数据;
2. 在像素数据上叠加水印;
3. 保存叠加水印后的像素数据到新的bmp文件中。
以下是一个示例代码,可以用来给bmp图片加水印:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// bmp文件头结构体
#pragma pack(2)
typedef struct {
unsigned short bfType; // 文件类型,必须为0x4D42
unsigned int bfSize; // 文件大小
unsigned short bfReserved1; // 保留字
unsigned short bfReserved2; // 保留字
unsigned int bfOffBits; // 像素数据的偏移量
} BITMAPFILEHEADER;
// bmp信息头结构体
typedef struct {
unsigned int biSize; // 信息头大小
int biWidth; // 图像宽度
int biHeight; // 图像高度
unsigned short biPlanes; // 颜色平面数
unsigned short biBitCount; // 每个像素的位数
unsigned int biCompression; // 压缩类型
unsigned int biSizeImage; // 压缩图像大小
int biXPelsPerMeter; // 水平分辨率
int biYPelsPerMeter; // 垂直分辨率
unsigned int biClrUsed; // 颜色数
unsigned int biClrImportant; // 重要颜色数
} BITMAPINFOHEADER;
// 像素结构体
typedef struct {
unsigned char b; // 蓝色分量
unsigned char g; // 绿色分量
unsigned char r; // 红色分量
} PIXEL;
int main() {
// 打开bmp文件
FILE* fp = fopen("test.bmp", "rb");
if (!fp) {
printf("无法打开文件!\n");
return -1;
}
// 读取文件头
BITMAPFILEHEADER fileHeader;
fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
// 判断文件类型是否为0x4D42
if (fileHeader.bfType != 0x4D42) {
printf("不是bmp文件!\n");
return -1;
}
// 读取信息头
BITMAPINFOHEADER infoHeader;
fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
// 判断位数是否为24位
if (infoHeader.biBitCount != 24) {
printf("不支持的位数!\n");
return -1;
}
// 计算像素数据大小
int pixelSize = (infoHeader.biBitCount + 7) / 8;
int rowSize = (infoHeader.biWidth * pixelSize + 3) / 4 * 4;
int dataSize = rowSize * infoHeader.biHeight;
// 读取像素数据
PIXEL* pixels = (PIXEL*)malloc(dataSize);
fseek(fp, fileHeader.bfOffBits, SEEK_SET);
fread(pixels, dataSize, 1, fp);
// 叠加水印
char* watermark = "Watermark";
int watermarkLen = strlen(watermark);
for (int y = 0; y < infoHeader.biHeight; y++) {
for (int x = 0; x < infoHeader.biWidth; x++) {
PIXEL* pixel = &pixels[y * rowSize / pixelSize + x];
if (x < watermarkLen) {
pixel->r = pixel->g = pixel->b = 0;
}
}
}
// 创建新的bmp文件
FILE* fp2 = fopen("test_with_watermark.bmp", "wb");
if (!fp2) {
printf("无法创建文件!\n");
return -1;
}
// 写入文件头
fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fp2);
// 写入信息头
fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fp2);
// 写入像素数据
fseek(fp2, fileHeader.bfOffBits, SEEK_SET);
fwrite(pixels, dataSize, 1, fp2);
// 关闭文件
fclose(fp);
fclose(fp2);
return 0;
}
```
请注意,上述代码只是一个简单的示例,仅支持24位bmp图片。实际应用中,需要根据需求进行修改和优化。