资源简介
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语言面试笔试题,经典题目
- C语言编程常见问题解答.pdf
- 操作系统c语言模拟文件管理系统844
- C语言开发实战宝典
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
川公网安备 51152502000135号
评论
共有 条评论