Linux下BMP圖片添加水印
BMP是英文Bitmap(位圖)的簡寫,它是Windows操作系統(tǒng)中的標準圖像文件格式,能夠被多種Windows應(yīng)用程序所支持。隨著Windows操作系統(tǒng)的流行與豐富的Windows應(yīng)用程序的開發(fā),BMP位圖格式理所當然地被廣泛應(yīng)用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前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]$
程序示例
- 添加水印函數(shù)
/**********************添加水印************************************
**形參:
** 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]文件打開或創(chuàng)建失敗",__FUNCTION__,__LINE__);
return 2;
}
BMP_HEADER bmp_head;
BMP_INFO bmp_info;
fread(&bmp_head,sizeof(BMP_HEADER),1,fp[0]);//讀取頭數(shù)據(jù)
fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp[1]);//頭數(shù)據(jù)寫入到新的文件中
fread(&bmp_info,sizeof(BMP_INFO),1,fp[0]);//讀取位圖數(shù)據(jù)
fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//位圖數(shù)據(jù)寫入到新的文件中
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;//一行的字節(jié)數(shù)
while(one_line_size%4!=0)one_line_size++;//字節(jié)數(shù)不是4的倍數(shù)補全
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;//設(shè)置水印的顏色
int cnt=0;
for(k=0;k;k++)>;i++)>
-
主函數(shù)
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);//創(chuàng)建進程
}
else printf("[%s line %d] err %d\n",__FUNCTION__,__LINE__,stat);
return 0;
}
-
BMP格式結(jié)構(gòu)體
#pragma pack(1) /* 必須在結(jié)構(gòu)體定義之前使用,這是為了讓結(jié)構(gòu)體中各成員按1字節(jié)對齊*/
/*圖片頭*/
typedef struct BitMapFileHEADER
{
unsigned short bfType; //保存圖片類型。 'BM'
unsigned long bfSize; //圖片文件的總大小,以字節(jié)為單位(3-6字節(jié),低位在前)
unsigned short bfReserved1;//位圖文件保留字,必須為0(7-8字節(jié))
unsigned short bfReserved2;//位圖文件保留字,必須為0(9-10字節(jié))
unsigned long bfOffBits; //RGB數(shù)據(jù)偏移地址,位圖數(shù)據(jù)的起始位置,以相對于位圖(11-14字節(jié),低位在前)//文件頭的偏移量表示,以字節(jié)為單位
}BMP_HEADER;
/*圖片信息*/
typedef struct BitMapFileInfo{
unsigned long biSize; //本結(jié)構(gòu)所占用字節(jié)數(shù)(15-18字節(jié))
unsigned long biWidth; //位圖的寬度,以像素為單位(19-22字節(jié))
unsigned long biHeight; //位圖的高度,以像素為單位(23-26字節(jié))
unsigned short biPlanes; //目標設(shè)備的級別,必須為1(27-28字節(jié))
unsigned short biBitCount; //每個像素所需的位數(shù),必須是1(雙色)(29-30字節(jié)),4(16色),8(256色)16(高彩色)或24(真彩色)之一
unsigned long biCompression;//位圖壓縮類型,必須是0(不壓縮),(31-34字節(jié))
//1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
unsigned long biSizeImage; //位圖的大小(其中包含了為了補齊行數(shù)是4的倍數(shù)而添加的空字節(jié)),以字節(jié)為單位(35-38字節(jié))
unsigned long biXPelsPerMeter;//位圖水平分辨率,每米像素數(shù)(39-42字節(jié))
unsigned long biYPelsPerMeter;//位圖垂直分辨率,每米像素數(shù)(43-46字節(jié))
unsigned long biClrUsed; //位圖實際使用的顏色表中的顏色數(shù)(47-50字節(jié))
unsigned long biClrImportant; //位圖顯示過程中重要的顏色數(shù)(51-54字節(jié))
}BMP_INFO;
-
漢字取模點陣
//牛轉(zhuǎn)乾坤取模
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},/*"轉(zhuǎn)",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*/
};
-
查看添加水印后的圖片
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Linux
+關(guān)注
關(guān)注
87文章
11350瀏覽量
210477 -
WINDOWS
+關(guān)注
關(guān)注
4文章
3573瀏覽量
89368 -
BMP
+關(guān)注
關(guān)注
0文章
48瀏覽量
17105
發(fā)布評論請先 登錄
相關(guān)推薦
教你如何給PDF文件添加水印
? ? 為了保證PDF文件的完整性,防止他人在其他用途上仿制使用該文件,這就是需要給PDF文件添加水印的目的,那么,怎么給PDF文件添加水印呢?使用迅捷PDF編輯器可以輕松實現(xiàn),跟隨小編學起來
發(fā)表于 07-09 13:53
?908次閱讀
用PDF編輯軟件如何為PDF文件添加水印
? ? ? ?無論是工作中,還是生活中都會使用到PDF文件,PDF文件的修改編輯是需要使用到PDF編輯軟件的,那么,用PDF編輯軟件如何為PDF文件添加水印呢,是不是有很多的小伙伴都想知道怎么操作
發(fā)表于 11-19 11:34
?458次閱讀
報告如何單獨添加水印?永洪BIV9.2解鎖版權(quán)保護新方式
多個版本, 永洪BIV9.2加強版水印問世--支持為報告單獨添加水印,可以完美解決大家的各種需求場景 , 棒呆!接下來就跟著咱們看看新版水印如何使用吧! 【需求】報告單獨設(shè)置水印 1
發(fā)表于 05-28 14:53
?1545次閱讀
Linux應(yīng)用開發(fā)-LCD顯示BMP圖片
為了解BMP格式,這篇文章就采用Linux開發(fā)板作為實驗平臺,在LCD屏上讀取BMP圖片,完成繪制,不需要借助任何第三方庫,全部由純C語言代碼一行一行敲出來,深入理解
linux下BMP圖片旋轉(zhuǎn)
,BMP位圖格式理所當然地被廣泛應(yīng)用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
Linux下BMP圖片截圖
,BMP位圖格式理所當然地被廣泛應(yīng)用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
Linux下BMP圖片縮放
,BMP位圖格式理所當然地被廣泛應(yīng)用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
Linux開發(fā)_文件目錄操作介紹、創(chuàng)建BMP圖片
介紹C語言文件編程,創(chuàng)建BMP圖片,BMP圖片結(jié)構(gòu)介紹,介紹目錄接口編程,Makefile知識點。
Linux開發(fā)_介紹BMP圖片上下翻轉(zhuǎn)、添加水印
介紹BMP圖片上下翻轉(zhuǎn)、添加水印、通過學習BMP圖片結(jié)構(gòu)學習文件編程。
java如何處理圖片水印
在項目中經(jīng)常有需要在圖片上添加水印的需求以及在某些場合下需要身份證圖片,這時就可以對身份證上加水印防止被用于其他用途,java 在處理
評論