资源简介
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
- 上一篇:MFC 自适应不规则按钮类
- 下一篇:Linux FTP模拟系统
相关资源
- C语言嵌入式Modbus协议栈,支持主站和
- C语言封装的HttpClient接口
- C语言课设计算器
- C语言 学生兴趣管理系统
- c语言实现火车订票系统(控制台)源
- 模拟笔记本电脑(C语言实现)
- c语言实现竞技比赛打分系统
- KMP算法C语言程序
- Linux c语言 学生成绩管理系统
- 弹跳的小球(test.c)
- 林锐—高质量C编程
- 基于c语言的通讯录系统
- C语言全套课件与教学资料-哈工大
- 计算机二级C语言真题.docx
- C语言实现 设备信息管理系统
- GBT 28169-2011 嵌入式软件 C语言编码规范
- C语言标准库函数大全.chm
- C语言常用代码(分章节)
- c语言课程设计:客房登记系统源码
- C语言常用算法源代码
- 吕鑫:VS2015之博大精深的0基础C语言视
- c语言文都讲义2020
- c语言课件56883
- C语言推箱子win控制台
- C语言程序设计50例.docx
- 烟花优化算法(c语言版)
- C语言程序设计教材习题参考答案.do
- 数据结构(C语言版)ppt课件,清华,
- c语言编程经典例题100例 word版
- C语言编译器的设计与实现.doc
评论
共有 条评论