Linux下BMP圖片截圖
MP是英文Bitmap(位圖)的簡寫,它是Windows操作系統中的標準圖像文件格式,能夠被多種Windows應用程序所支持。隨著Windows操作系統的流行與豐富的Windows應用程序的開發,BMP位圖格式理所當然地被廣泛應用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
實際產品中我們經常用到圖片截取功能,本示例主要完成對BMP圖片截圖功能。
- 原始圖片
- 程序執行效果:
[xsw@xsw BMP_stady]$ gcc screenshot.c
[xsw@xsw BMP_stady]$ ./a.out
格式:./a.out
[xsw@xsw BMP_stady]$ ./a.out new.bmp watermark.bmp
源圖寬:504
源圖高:314
請輸截取的起始坐標(x1,y1)、結束坐標(x2、y2):89 53 323 251
新圖片寬:234
新圖片高:198
[xsw@xsw BMP_stady]$
- 截圖示例
/*****************************截圖*********************************
**
**形參:const char *new_bmp -- 截取圖片名
** const char *befor_bmp --源圖名
**返回值:0 -- 成功, 其它值 -- 失敗
******************************************************************/
int BMP_Screenshot(const char *new_bmp,const char *befor_bmp)
{
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]);//讀取頭數據
if(bmp_head.bfType!=0x4d42)
{
printf("[%s line %d]圖片格式錯誤\n",__FUNCTION__,__LINE__);
fclose(fp[0]);
fclose(fp[1]);
return 3;
}
int w,h;
fread(&bmp_info,sizeof(BMP_INFO),1,fp[0]);
h=bmp_info.biHeight;
w=bmp_info.biWidth;
printf("\t\t源圖寬:%d\n",w);
printf("\t\t源圖高:%d\n",h);
int x1,y1,x2,y2;
int width_size;
int height_size;
pp:
printf("\n\t請輸截取的起始坐標(x1,y1)、結束坐標(x2、y2):");
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
width_size=x1>x2?(x1-x2):(x2-x1);//要截取的圖片寬
height_size=y1>y2?(y1-y2):(y2-y1);//要截取的圖片高
int temp;
/*保證填入的坐標在源圖范圍之內*/
if( width_size==0 || height_size==0 ||
width_size>w || height_size>h ||
y1>h || y2>h || x1>w || x2>w ||
x1<0 || x2<0 || y1<0 ||y2<0
)
{
printf("\t輸入的參數有誤,請重新輸入\n");
goto pp;
}
/**保證x1x2)
{
temp=x1;
x1=x2;
x2=temp;
}
/**保證y1y2)
{
temp=y1;
y1=y2;
y2=temp;
}
bmp_head.bfOffBits=sizeof(BMP_HEADER)+sizeof(BMP_INFO);//RGB顏色偏移地址
bmp_head.bfSize=height_size*width_size*3+bmp_head.bfOffBits;//BMP圖片總大小
fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp[1]);//寫入頭數據到新文件
bmp_info.biWidth=width_size;//新圖片寬度
bmp_info.biHeight=height_size;//新圖片高度
printf("\t\t新圖片寬:%d\n",bmp_info.biWidth);
printf("\t\t新圖片高:%d\n",bmp_info.biHeight);
int oneline_byte=bmp_info.biWidth*3;
while(oneline_byte%4)oneline_byte++;//新圖片一行字節數,不是4的倍數補齊
bmp_info.biSizeImage=bmp_info.biHeight*oneline_byte;//位圖大小
fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//寫入位圖數據到新文件
int socure_oneline_byte=w*3;
while(socure_oneline_byte%4)socure_oneline_byte++;//源圖片一行字節數,不是4的倍數補齊
int i,j;
int offset;
unsigned char buff[oneline_byte];//新圖片一行的緩沖區
for(i=y2-1;i>=y1;i--)
{
offset=(h-1-i)*socure_oneline_byte+x1*3+bmp_head.bfOffBits;//先偏移到要截取圖片的最后一行
fseek(fp[0],offset,SEEK_SET);
fread(buff,oneline_byte,1,fp[0]);//讀取要截取的一行大小
fwrite(buff,oneline_byte,1,fp[1]);//寫入到新文件中
}
fclose(fp[0]);
fclose(fp[1]);
return 0;
}
,方便后面文件指針偏移******>,方便后面文件指針偏移******>
- 主函數
int main(int argc,char **argv)
{
if(argc!=3)
{
printf("格式:./a.out \n");
return 0;
}
int stat;
char buff[20];
stat=BMP_Screenshot(argv[1],argv[2]);
if(stat>0)printf("[%s line %d] err %d\n",__FUNCTION__,__LINE__,stat);
else
{
snprintf(buff,sizeof(buff),"eog %s",argv[1]);//字符串拼接
system(buff);//創建進程
}
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;
在對BMP圖片進行90°旋轉時需要注意的點:
1.每一行的字節數,當行字節數不是4的倍數需要用0補齊。
2.對于截取的圖片坐標做好判斷,當輸入坐標不合理時應請求重新輸入或退出。
3.BMP圖片RGB顏色數據讀取順序是從下往上,從左往右,圖片截取時注意讀寫順序。
-
注:以上示例均在32位redHat6.3 linux下實現,若是64位linux系統需要注意結構體大小。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11292瀏覽量
209323 -
BMP
+關注
關注
0文章
48瀏覽量
17060 -
圖片處理
+關注
關注
0文章
16瀏覽量
6863 -
截圖
+關注
關注
0文章
21瀏覽量
4103
發布評論請先 登錄
相關推薦
BMP圖片分析軟件
使用說明 本軟件目前只支持8位、16位和24位的BMP圖片,至于其他格式圖片,暫不支持。在后面我將會實時進行軟件升級,謝謝大家的支持!
發表于 01-12 15:44
?82次下載
bmp圖片轉換為PCB圖的軟件
bmp圖片轉換為PCB圖的軟件
BMP是一種與硬件設備無關的圖像文件格式,使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此
發表于 03-29 13:51
?146次下載
ScrToPicc截圖小工具應用程序免費下載
ScrToPicc是一款綠色截圖小工具,無需安裝即可使用,主要用于屏幕截圖,使用起來非常方便。支持自定義區域截圖,窗口截圖,圖片編輯功能,可
發表于 09-17 08:00
?0次下載
嵌入式linux操作framebuffer顯示bmp圖片
編譯后拷貝進開發板即可使用使用方法./fb_show_bmp test.bmp顯示的圖片由參數指定,上面指令中test.bmp為測試用的bmp
發表于 11-01 17:06
?10次下載
Linux應用開發-LCD顯示BMP圖片
為了解BMP格式,這篇文章就采用Linux開發板作為實驗平臺,在LCD屏上讀取BMP圖片,完成繪制,不需要借助任何第三方庫,全部由純C語言代碼一行一行敲出來,深入理解
Linux下BMP圖片添加水印
BMP是英文Bitmap(位圖)的簡寫,它是Windows操作系統中的標準圖像文件格式,能夠被多種Windows應用程序所支持。隨著Windows操作系統的流行與豐富的Windows應用程序的開發
linux下BMP圖片旋轉
,BMP位圖格式理所當然地被廣泛應用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
Linux下BMP圖片縮放
,BMP位圖格式理所當然地被廣泛應用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
評論