• 大小: 560KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-17
  • 语言: C/C++
  • 标签: c语言  加水印  

资源简介

c语言BMP文件加水印,可使用devc++打开,使用c语言给BMP文件加水印

资源截图

代码片段和文件信息

#include 
#include 
#include 

unsigned char *pBmpBuf;//读入图像数据的指针
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数


int readBmp(char *bmpName){
FILE *fp=fopen(bmpName“rb“);//二进制读方式打开指定的图像文件
if(fp==0){
printf(“打水印失败\n“);
return 0;
}

fseek(fp sizeof(BITMAPFILEHEADER)0);//跳过位图文件头结构BITMAPFILEHEADER
BITMAPINFOHEADER head;  //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
fread(&head sizeof(BITMAPINFOHEADER) 1fp); 

bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;//获取图像宽、高、每像素所占位数等信息
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)

if(biBitCount==8){//灰度图像有颜色表,且颜色表表项为256
pColorTable=malloc(sizeof(RGBQUAD)*256); //申请颜色表所需要的空间,读颜色表进内存
fread(pColorTablesizeof(RGBQUAD)256fp);
}
pBmpBuf=malloc(sizeof(unsigned char)*lineByte * bmpHeight);//申请位图数据所需要的空间,读位图数据进内存
fread(pBmpBuf1lineByte * bmpHeightfp);
fclose(fp);//关闭文件
return 1;
}


int saveBmp(char *bmpName unsigned char *imgBuf int width int height int biBitCount RGBQUAD *pColorTable){
if(!imgBuf)//如果位图数据指针为0,则没有数据传入,函数返回
return 0;
int colorTablesize=0;//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
if(biBitCount==8)
colorTablesize=1024;
int lineByte=(width * biBitCount/8+3)/4*4;//待存储图像数据每行字节数为4的倍数
FILE *fp=fopen(bmpName“wb“);//以二进制写的方式打开文件
if(fp==0){
printf(“!!!!\n“);
return 0;
}

BITMAPFILEHEADER fileHead;//申请位图文件头结构变量,填写文件头信息
fileHead.bfType = 0x4D42;//bmp类型
fileHead.bfSize= sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;//bfSize是图像文件4个组成部分之和
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
fileHead.bfOffBits=54+colorTablesize;//bfOffBits是图像文件前3个部分所需空间之和
fwrite(&fileHead sizeof(BITMAPFILEHEADER)1 fp);//写文件头进文件

BITMAPINFOHEADER head; //申请位图信息头结构变量,填写信息头信息
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
fwrite(&head sizeof(BITMAPINFOHEADER)1 fp);//写位图信息头进内存
 
if(biBitCount==8)//如果灰度图像,有颜色表,写入文件 
fwrite(pColorTable sizeof(RGBQUAD)256 fp);
fwrite(imgBuf height*lineByte 1 fp);//写位图数据进文件
fclose(fp);//关闭文件
 return 1;
}


int main(){
int o=0;//RGB计数器 
printf(“BMP文件录入位置:\nE:/project/devcpp/img/input1.BMP\nE:/project/devcpp/img/input2.BMP\n\n“);
char readPath1[]=“E:/project/devcpp/img/input1.BMP“;//读入指定BMP文件进内存
readBmp(readPath1);
unsigned char *pBmpBuf1=pBmpBuf;;//读入图像数据的指针
int bmpWidth1=bmpWidth;//图像的宽
int bmpHeight1=bmpHeight;//图像的高
RGBQUAD *pColorTable1=pColorTable;//颜色表指针
int biBitCount1=biBitCount;//图像类型,每像素位数

char readPath2[]=“E:/project/devcpp/img/input2.BMP“;//读入指定BMP文件进内存
readBmp(readPath2);
unsigned char *pBmpBuf2=pBmpBuf;;//读入图像数据的指针
int bmpWi

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-06-07 18:12  BMP WaterMark\
     文件        5120  2017-09-08 10:01  BMP WaterMark\BMPWaterMark.c
     文件         918  2017-08-30 08:49  BMP WaterMark\BMPWaterMark.dev
     文件     1116885  2017-09-08 10:01  BMP WaterMark\BMPWaterMark.exe
     文件          94  2017-09-08 11:03  BMP WaterMark\BMPWaterMark.layout
     文件      986887  2017-09-08 10:01  BMP WaterMark\BMPWaterMark.o
     文件        1180  2017-09-08 10:01  BMP WaterMark\Makefile.win

评论

共有 条评论