0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux下BMP图片添加水印

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-08-16 11:20 次阅读

Linux下BMP图片添加水印

BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点–占用磁盘空间过大。所以,目前BMP在单机上比较流行。

给BMP图片添加水印的方法有很多,本示例采用直接读写文件方式来添加水印。

示例效果:
原始图片

运行程序:

[xsw@xsw BMP_stady]$ ./a.out 
格式:./a.out <1.bmp> <2.bmp>
[xsw@xsw BMP_stady]$ ./a.out watermark.bmp 2.bmp
	图片宽:500
	图片高:312

	请输入水印添加的位置(x:0~500 y:0~312):600 200

	[BMP_add_Watermark line 117]超出显示边线,请重新输入

	请输入水印添加的位置(x:0~500 y:0~312):100 100

[xsw@xsw BMP_stady]$ 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

程序示例

  • 添加水印函数
/**********************添加水印************************************
**形参:
**     char *new_bmp  ---新生成的图片
**     char *bmp_file ---需要添加水印的图片
**     int num    --- 要添加几个汉字水印
**     int size   --- 汉字大小(等高宽)
**返回值:0 成功,其他值---错误
*******************************************************************/
int BMP_add_Watermark(char *new_bmp,char *befor_bmp,int num,int size)
{
    FILE *fp[2];
    fp[0]=fopen(befor_bmp,"rb");
    if(fp[0]==NULL)
    {
        printf("[%s line %d]文件打开失败",__FUNCTION__,__LINE__);
        return 1;
    }
    fp[1]=fopen(new_bmp,"w+b");
    if(fp[1]==NULL)
    {
        printf("[%s line %d]文件打开或创建失败",__FUNCTION__,__LINE__);
        return 2;
    }
    BMP_HEADER bmp_head;
    BMP_INFO bmp_info;
    fread(&bmp_head,sizeof(BMP_HEADER),1,fp[0]);//读取头数据
    fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp[1]);//头数据写入到新的文件中
    fread(&bmp_info,sizeof(BMP_INFO),1,fp[0]);//读取位图数据
    fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//位图数据写入到新的文件中
    if(bmp_head.bfType!=0x4d42)
    {
        printf("[%s line %d]图片格式错误\n",__FUNCTION__,__LINE__);
        return 3;
    }
    printf("\t图片宽:%d\n",bmp_info.biWidth);
    printf("\t图片宽:%d\n",bmp_info.biHeight);
    int one_line_size=bmp_info.biWidth*3;//一行的字节数
    while(one_line_size%4!=0)one_line_size++;//字节数不是4的倍数补全
    unsigned char one_line_buff[one_line_size];
    int i;
    /*复制图片*/
    for(i=0;ibmp_info.biWidth-num*size || y>bmp_info.biHeight-size)
    {
        printf("\n\t[%s line %d]超出显示边线,请重新输入\n",__FUNCTION__,__LINE__);
        goto pp;
    }
    int j,k;
    int y1=y;
    unsigned char data=0;
    int rgb=0xff0000;//设置水印的颜色
    int cnt=0;
    for(k=0;k;k++)>;i++)>
  • 主函数
int main(int argc,char **argv)
{
    if(argc!=3)
    {
        printf("格式:./a.out <1.bmp> <2.bmp>\n");
        return 0;
    }
    int stat=0;
    char buff[20];
    stat=BMP_add_Watermark(argv[1],argv[2],4,24);
    if(stat==0)
    {
        snprintf(buff,sizeof(buff),"eog %s",argv[1]);//字符串拼接
        system(buff);//创建进程
    }
    else printf("[%s line %d] err %d\n",__FUNCTION__,__LINE__,stat);
    return 0;
}
  • BMP格式结构体
#pragma pack(1)  /* 必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐*/
/*图片头*/
typedef struct BitMapFileHEADER
{
	unsigned short bfType;      //保存图片类型。 'BM'
	unsigned long  bfSize;      //图片文件的总大小,以字节为单位(3-6字节,低位在前)
	unsigned short bfReserved1;//位图文件保留字,必须为0(7-8字节)
	unsigned short bfReserved2;//位图文件保留字,必须为0(9-10字节) 
	unsigned long  bfOffBits;  //RGB数据偏移地址,位图数据的起始位置,以相对于位图(11-14字节,低位在前)//文件头的偏移量表示,以字节为单位
}BMP_HEADER;

/*图片信息*/
typedef struct BitMapFileInfo{
	unsigned long  biSize;      //本结构所占用字节数(15-18字节)
	unsigned long  biWidth;     //位图的宽度,以像素为单位(19-22字节)
	unsigned long  biHeight;    //位图的高度,以像素为单位(23-26字节)
	unsigned short biPlanes;    //目标设备的级别,必须为1(27-28字节)
	unsigned short biBitCount;   //每个像素所需的位数,必须是1(双色)(29-30字节),4(16色),8(256色)16(高彩色)或24(真彩色)之一
	unsigned long  biCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)
//1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
	unsigned long  biSizeImage;  //位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)
	unsigned long  biXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)
	unsigned long  biYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)
	unsigned long  biClrUsed;      //位图实际使用的颜色表中的颜色数(47-50字节)
	unsigned long  biClrImportant; //位图显示过程中重要的颜色数(51-54字节)
}BMP_INFO;
  • 汉字取模点阵
//牛转乾坤取模
const unsigned char font_buff[][24*24/8]=
{
{0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x08,0x00,0x01,0x88,0x00,0x01,0x88,0x00,0x01,0x8F,0xC0,0x03,0xFC,0x00,0x02,0x08,0x00,0x04,0x08,0x00,0x00,0x08,0x7C,
0x00,0x7F,0xFE,0x3F,0xC8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00},/*"牛",0*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x81,0x80,0x01,0x01,0x80,0x03,0x01,0x00,0x02,0xE1,0x00,0x1F,0x81,0xF0,0x04,0x0F,0x00,0x05,0x82,0x00,0x09,0x02,0x1C,0x09,0xC7,0xF8,
0x1F,0x3A,0x00,0x01,0x06,0x00,0x01,0xC4,0xE0,0x0F,0x07,0x70,0x39,0x00,0x40,0x01,0x00,0x80,0x01,0x04,0x80,0x01,0x03,0x00,0x01,0x01,0x80,0x01,0x01,0x80,0x00,0x00,0x80,0x00,0x00,0x00},/*"转",1*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x83,0x00,0x01,0x02,0x00,0x01,0xE6,0x00,0x0F,0x84,0x00,0x01,0x04,0x20,0x02,0x05,0xC0,0x03,0xEA,0x00,0x1C,0x70,0x00,0x19,0x60,0x00,
0x0E,0x41,0x80,0x09,0xCF,0x00,0x0F,0x02,0x00,0x01,0x24,0x00,0x01,0xC4,0x00,0x7F,0x08,0x04,0x21,0x08,0x04,0x01,0x0C,0x04,0x03,0x06,0x3C,0x01,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x00},/*"乾",2*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x01,0x80,0x06,0x01,0x00,0x06,0x01,0x00,0x06,0x01,0x18,0x06,0x01,0xFC,0x06,0x7F,0x0C,0x07,0xA1,0x0C,0x1E,0x33,0xE8,0x06,0x37,0x18,
0x06,0x11,0x18,0x06,0x91,0x10,0x07,0x1F,0xF0,0x1C,0x11,0x00,0x30,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00},/*"坤",3*/
};
  • 查看添加水印后的图片

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206724
  • WINDOWS
    +关注

    关注

    3

    文章

    3438

    浏览量

    87142
  • BMP
    BMP
    +关注

    关注

    0

    文章

    48

    浏览量

    16964
收藏 人收藏

    评论

    相关推荐

    批量縮小照片,加水印工具 (单文件版)

    批量縮小照片,加水印工具 (单文件版) 
    发表于 10-06 11:29

    如何怎么样删除去pdf水印

    如何怎么样删除去pdf水印:总结了几个方法,你看哪个比较好用: 一、1 使用Acrobt Professional v7.0中文版打开PDF文件; 2 文档→添加水印和背景: 2.1 “类
    发表于 01-26 12:33 2.5w次阅读

    BMP图片文件详解

    BMP图片文件详解,很好的资料,快来学习吧
    发表于 02-18 14:16 0次下载

    C#教程之批量添加水印

    C#教程之批量添加水印,很好的C#资料,快来学习吧。
    发表于 04-20 11:13 5次下载

    基于STM32的BMP图片的解码系统

    基于STM32的BMP图片的解码系统
    发表于 09-25 11:12 12次下载
    基于STM32的<b class='flag-5'>BMP</b><b class='flag-5'>图片</b>的解码系统

    教你如何给PDF文件添加水印

        为了保证PDF文件的完整性,防止他人在其他用途上仿制使用该文件,这就是需要给PDF文件添加水印的目的,那么,怎么给PDF文件添加水印呢?使用迅捷PDF编辑器可以轻松实现,跟随小编学起来
    发表于 07-09 13:53 716次阅读
    教你如何给PDF文件<b class='flag-5'>添加水印</b>

    用PDF编辑软件如何为PDF文件添加水印

           无论是工作中,还是生活中都会使用到PDF文件,PDF文件的修改编辑是需要使用到PDF编辑软件的,那么,用PDF编辑软件如何为PDF文件添加水印呢,是不是有很多的小伙伴都想知道怎么操作
    发表于 11-19 11:34 305次阅读

    报告如何单独添加水印?永洪BIV9.2解锁版权保护新方式

    多个版本, 永洪BIV9.2加强版水印问世--支持为报告单独添加水印,可以完美解决大家的各种需求场景 , 棒呆!接下来就跟着咱们看看新版水印如何使用吧! 【需求】报告单独设置水印 1
    发表于 05-28 14:53 1149次阅读
    报告如何单独<b class='flag-5'>添加水印</b>?永洪BIV9.2解锁版权保护新方式

    剖析BMP图片文件

    剖析BMP图片文件
    发表于 01-23 10:05 2次下载

    Linux应用开发-LCD显示BMP图片

    为了解BMP格式,这篇文章就采用Linux开发板作为实验平台,在LCD屏上读取BMP图片,完成绘制,不需要借助任何第三方库,全部由纯C语言代码一行一行敲出来,深入理解
    的头像 发表于 08-14 09:18 2319次阅读

    Linux开发_文件目录操作介绍、创建BMP图片

    介绍C语言文件编程,创建BMP图片BMP图片结构介绍,介绍目录接口编程,Makefile知识点。
    的头像 发表于 09-17 15:44 1165次阅读
    <b class='flag-5'>Linux</b>开发_文件目录操作介绍、创建<b class='flag-5'>BMP</b><b class='flag-5'>图片</b>

    Linux开发_介绍BMP图片上下翻转、添加水印

    介绍BMP图片上下翻转、添加水印、通过学习BMP图片结构学习文件编程。
    的头像 发表于 09-17 15:43 1386次阅读

    Linux开发_BMP图片编程(翻转、添加水印)

    接收BMP图片编程,完成BMP图片翻转、水印添加等知识点。
    的头像 发表于 09-17 15:33 1134次阅读
    <b class='flag-5'>Linux</b>开发_<b class='flag-5'>BMP</b><b class='flag-5'>图片</b>编程(翻转、<b class='flag-5'>添加水印</b>)

    Python批量加水印

    现在只要你会使用命令,我们就能教大家怎么使用Python超级简单地为图片添加水印
    的头像 发表于 02-24 11:06 523次阅读
    Python批量<b class='flag-5'>加水印</b>

    java如何处理图片水印

    在项目中经常有需要在图片添加水印的需求以及在某些场合下需要身份证图片,这时就可以对身份证上加水印防止被用于其他用途,java 在处理图片
    的头像 发表于 10-09 16:21 473次阅读