0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下BMP圖片截圖

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-08-18 17:09 ? 次閱讀

Linux下BMP圖片截圖

MP是英文Bitmap(位圖)的簡(jiǎn)寫,它是Windows操作系統(tǒng)中的標(biāo)準(zhǔn)圖像文件格式,能夠被多種Windows應(yīng)用程序所支持。隨著Windows操作系統(tǒng)的流行與豐富的Windows應(yīng)用程序的開發(fā),BMP位圖格式理所當(dāng)然地被廣泛應(yīng)用。這種格式的特點(diǎn)是包含的圖像信息較豐富,幾乎不進(jìn)行壓縮,但由此導(dǎo)致了它與生俱來(lái)的缺點(diǎn)–占用磁盤空間過大。所以,目前BMP在單機(jī)上比較流行。

實(shí)際產(chǎn)品中我們經(jīng)常用到圖片截取功能,本示例主要完成對(duì)BMP圖片截圖功能。

  • 原始圖片
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center
  • 程序執(zhí)行效果:
[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

	請(qǐng)輸截取的起始坐標(biāo)(x1,y1)、結(jié)束坐標(biāo)(x2、y2):89 53 323 251
		新圖片寬:234
		新圖片高:198
[xsw@xsw BMP_stady]$ 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70
  • 截圖示例
/*****************************截圖*********************************
 **
 **形參: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]文件打開或創(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ù)
    if(bmp_head.bfType!=0x4d42)
    {
        printf("[%s line %d]圖片格式錯(cuò)誤\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請(qǐng)輸截取的起始坐標(biāo)(x1,y1)、結(jié)束坐標(biāo)(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;
    /*保證填入的坐標(biāo)在源圖范圍之內(nèi)*/
    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輸入的參數(shù)有誤,請(qǐng)重新輸入\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]);//寫入頭數(shù)據(jù)到新文件
    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++;//新圖片一行字節(jié)數(shù),不是4的倍數(shù)補(bǔ)齊
    bmp_info.biSizeImage=bmp_info.biHeight*oneline_byte;//位圖大小
    fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//寫入位圖數(shù)據(jù)到新文件
    int socure_oneline_byte=w*3;
    while(socure_oneline_byte%4)socure_oneline_byte++;//源圖片一行字節(jié)數(shù),不是4的倍數(shù)補(bǔ)齊
    int i,j;
    int offset;
    unsigned char buff[oneline_byte];//新圖片一行的緩沖區(qū)
    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;
}
,方便后面文件指針偏移******>,方便后面文件指針偏移******>
  • 主函數(shù)
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);//創(chuàng)建進(jìn)程
    }
    return 0;
}
  • BMP位圖結(jié)構(gòu)體
#pragma pack(1)  /* 必須在結(jié)構(gòu)體定義之前使用,這是為了讓結(jié)構(gòu)體中各成員按1字節(jié)對(duì)齊*/
/*圖片頭*/
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ù)的起始位置,以相對(duì)于位圖(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;    //目標(biāo)設(shè)備的級(jí)別,必須為1(27-28字節(jié))
	unsigned short biBitCount;   //每個(gè)像素所需的位數(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;  //位圖的大小(其中包含了為了補(bǔ)齊行數(shù)是4的倍數(shù)而添加的空字節(jié)),以字節(jié)為單位(35-38字節(jié))
	unsigned long  biXPelsPerMeter;//位圖水平分辨率,每米像素?cái)?shù)(39-42字節(jié))
	unsigned long  biYPelsPerMeter;//位圖垂直分辨率,每米像素?cái)?shù)(43-46字節(jié))
	unsigned long  biClrUsed;      //位圖實(shí)際使用的顏色表中的顏色數(shù)(47-50字節(jié))
	unsigned long  biClrImportant; //位圖顯示過程中重要的顏色數(shù)(51-54字節(jié))
}BMP_INFO;

在對(duì)BMP圖片進(jìn)行90°旋轉(zhuǎn)時(shí)需要注意的點(diǎn):
1.每一行的字節(jié)數(shù),當(dāng)行字節(jié)數(shù)不是4的倍數(shù)需要用0補(bǔ)齊。
2.對(duì)于截取的圖片坐標(biāo)做好判斷,當(dāng)輸入坐標(biāo)不合理時(shí)應(yīng)請(qǐng)求重新輸入或退出。
3.BMP圖片RGB顏色數(shù)據(jù)讀取順序是從下往上,從左往右,圖片截取時(shí)注意讀寫順序。

  • 注:以上示例均在32位redHat6.3 linux下實(shí)現(xiàn),若是64位linux系統(tǒng)需要注意結(jié)構(gòu)體大小。
審核編輯 黃昊宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207912
  • BMP
    BMP
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    17006
  • 圖片處理
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    6817
  • 截圖
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    4078
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    BMP圖片分析軟件

    使用說明 本軟件目前只支持8位、16位和24位的BMP圖片,至于其他格式圖片,暫不支持。在后面我將會(huì)實(shí)時(shí)進(jìn)行軟件升級(jí),謝謝大家的支持!
    發(fā)表于 01-12 15:44 ?82次下載

    bmp圖片轉(zhuǎn)換為PCB圖的軟件

    bmp圖片轉(zhuǎn)換為PCB圖的軟件 BMP是一種與硬件設(shè)備無(wú)關(guān)的圖像文件格式,使用非常廣。它采用位映射存儲(chǔ)格式,除了圖像深度可選以外,不采用其他任何壓縮,因此
    發(fā)表于 03-29 13:51 ?146次下載

    BMP圖片文件詳解

    BMP圖片文件詳解,很好的資料,快來(lái)學(xué)習(xí)吧
    發(fā)表于 02-18 14:16 ?0次下載

    LCD彩色圖片轉(zhuǎn)換工具BMP_to_H

    LCD彩色圖片轉(zhuǎn)換工具BMP_to_H
    發(fā)表于 12-28 10:16 ?11次下載

    基于STM32的BMP圖片的解碼系統(tǒng)

    基于STM32的BMP圖片的解碼系統(tǒng)
    發(fā)表于 09-25 11:12 ?12次下載
    基于STM32的<b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>的解碼系統(tǒng)

    ScrToPicc截圖小工具應(yīng)用程序免費(fèi)下載

    ScrToPicc是一款綠色截圖小工具,無(wú)需安裝即可使用,主要用于屏幕截圖,使用起來(lái)非常方便。支持自定義區(qū)域截圖,窗口截圖,圖片編輯功能,可
    發(fā)表于 09-17 08:00 ?0次下載
    ScrToPicc<b class='flag-5'>截圖</b>小工具應(yīng)用程序免費(fèi)下載

    嵌入式linux操作framebuffer顯示bmp圖片

    編譯后拷貝進(jìn)開發(fā)板即可使用使用方法./fb_show_bmp test.bmp顯示的圖片由參數(shù)指定,上面指令中test.bmp為測(cè)試用的bmp
    發(fā)表于 11-01 17:06 ?10次下載
    嵌入式<b class='flag-5'>linux</b>操作framebuffer顯示<b class='flag-5'>bmp</b><b class='flag-5'>圖片</b>

    剖析BMP圖片文件

    剖析BMP圖片文件
    發(fā)表于 01-23 10:05 ?2次下載

    Linux應(yīng)用開發(fā)-LCD顯示BMP圖片

    為了解BMP格式,這篇文章就采用Linux開發(fā)板作為實(shí)驗(yàn)平臺(tái),在LCD屏上讀取BMP圖片,完成繪制,不需要借助任何第三方庫(kù),全部由純C語(yǔ)言代碼一行一行敲出來(lái),深入理解
    的頭像 發(fā)表于 08-14 09:18 ?2782次閱讀

    LinuxBMP圖片添加水印

    BMP是英文Bitmap(位圖)的簡(jiǎn)寫,它是Windows操作系統(tǒng)中的標(biāo)準(zhǔn)圖像文件格式,能夠被多種Windows應(yīng)用程序所支持。隨著Windows操作系統(tǒng)的流行與豐富的Windows應(yīng)用程序的開發(fā)
    的頭像 發(fā)表于 08-16 11:20 ?1128次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b><b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>添加水印

    linuxBMP圖片旋轉(zhuǎn)

    BMP位圖格式理所當(dāng)然地被廣泛應(yīng)用。這種格式的特點(diǎn)是包含的圖像信息較豐富,幾乎不進(jìn)行壓縮,但由此導(dǎo)致了它與生俱來(lái)的缺點(diǎn)–占用磁盤空間過大。所以,目前BMP在單機(jī)上比較流行。
    的頭像 發(fā)表于 08-16 11:27 ?1262次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>下</b><b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>旋轉(zhuǎn)

    LinuxBMP圖片縮放

    ,BMP位圖格式理所當(dāng)然地被廣泛應(yīng)用。這種格式的特點(diǎn)是包含的圖像信息較豐富,幾乎不進(jìn)行壓縮,但由此導(dǎo)致了它與生俱來(lái)的缺點(diǎn)–占用磁盤空間過大。所以,目前BMP在單機(jī)上比較流行。
    的頭像 發(fā)表于 08-18 17:14 ?1835次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b><b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>縮放

    Linux開發(fā)_文件目錄操作介紹、創(chuàng)建BMP圖片

    介紹C語(yǔ)言文件編程,創(chuàng)建BMP圖片,BMP圖片結(jié)構(gòu)介紹,介紹目錄接口編程,Makefile知識(shí)點(diǎn)。
    的頭像 發(fā)表于 09-17 15:44 ?1362次閱讀
    <b class='flag-5'>Linux</b>開發(fā)_文件目錄操作介紹、創(chuàng)建<b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>

    Linux開發(fā)_介紹BMP圖片上下翻轉(zhuǎn)、添加水印

    介紹BMP圖片上下翻轉(zhuǎn)、添加水印、通過學(xué)習(xí)BMP圖片結(jié)構(gòu)學(xué)習(xí)文件編程。
    的頭像 發(fā)表于 09-17 15:43 ?1693次閱讀

    Linux開發(fā)_BMP圖片編程(翻轉(zhuǎn)、添加水印)

    接收BMP圖片編程,完成BMP圖片翻轉(zhuǎn)、水印添加等知識(shí)點(diǎn)。
    的頭像 發(fā)表于 09-17 15:33 ?1395次閱讀
    <b class='flag-5'>Linux</b>開發(fā)_<b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>編程(翻轉(zhuǎn)、添加水印)