精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux下BMP圖片旋轉

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-08-16 11:27 ? 次閱讀

linux下BMP圖片旋轉

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

在使用圖片時我們經常需要用到旋轉,本示例主要完成對BMP圖片的順時針旋轉90°和逆時針旋轉90°。

  • 原始圖片
  • 程序執行效果:
[xsw@xsw BMP_stady]$ gcc rivolve.c 
[xsw@xsw BMP_stady]$ ./a.out 
格式:./a.out 
[xsw@xsw BMP_stady]$ ./a.out new.bmp watermark.bmp 

--------------------順時針旋轉90°----------------------
	旋轉后圖片寬:314
	旋轉后圖片高:504

--------------------逆時針旋轉90°----------------------
	旋轉后圖片寬:314
	旋轉后圖片高:504
[xsw@xsw BMP_stady]$ 
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

順時針旋轉90°示例

/***********************順時針旋轉90°**************************
**
**形參:const char *new_bmp -- 順時針90°后圖片
**     const char *befor_bmp  --原始圖片
**返回值:0 -- 成功,其他值 -- 失敗
**************************************************************/
int BMP_ClockWise_Revolve90(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;
    }
    fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp[1]);//頭數據寫入到新的文件中
    int w,h;//旋轉90°寬和高需要互換
    fread(&bmp_info,sizeof(BMP_INFO),1,fp[0]);//讀取位圖數據
    h=bmp_info.biHeight;
    w=bmp_info.biWidth;
    bmp_info.biWidth=h;//旋轉后圖片寬度
    bmp_info.biHeight=w;//旋轉后圖片高度
    fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//寫入位圖數據
    printf("\n--------------------順時針旋轉90°----------------------\n");
    printf("\t旋轉后圖片寬:%d\n",bmp_info.biWidth);
    printf("\t旋轉后圖片高:%d\n",bmp_info.biHeight);
    int befor_oneline_size=w*3;//之前圖片一行的字節數
    while(befor_oneline_size%4)befor_oneline_size++;//按4字節對齊
    int new_oneline_size=bmp_info.biWidth*3;//旋轉后圖片一行字節數
    while(new_oneline_size%4)new_oneline_size++;//按4字節對齊
    int i,j;
    int offset_count=0;
    int rgb=0;
    for(i=w-1;i>=0;i--)
    {
        for(j=0;jbmp_info.biWidth*3)
        {
            fwrite(&rgb,new_oneline_size-bmp_info.biWidth*3,1,fp[1]);//補全為4的倍數
        }
    }
    fclose(fp[0]);
    fclose(fp[1]);
    return 0;
}
;j++)>

逆時針旋轉90°示例

/***********************逆時針旋轉90°**************************
**
**形參:const char *new_bmp -- 逆時針90°后圖片
**     const char *befor_bmp  --原始圖片
**返回值:0 -- 成功,其他值 -- 失敗
**************************************************************/
int BMP_antiClockWise_Revolve90(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;
    }
    fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp[1]);//頭數據寫入到新的文件中
    int w,h;//旋轉90°寬和高需要互換
    fread(&bmp_info,sizeof(BMP_INFO),1,fp[0]);//讀取位圖數據
    h=bmp_info.biHeight;
    w=bmp_info.biWidth;
    bmp_info.biWidth=h;//旋轉后圖片寬度
    bmp_info.biHeight=w;//旋轉后圖片高度
    fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//寫入位圖數據
    printf("\n--------------------逆時針旋轉90°----------------------\n");
    printf("\t旋轉后圖片寬:%d\n",bmp_info.biWidth);
    printf("\t旋轉后圖片高:%d\n",bmp_info.biHeight); 
    int befor_oneline_size=w*3;//之前圖片一行的字節數
    while(befor_oneline_size%4)befor_oneline_size++;//按4字節對齊
    int new_oneline_size=bmp_info.biWidth*3;//旋轉后圖片一行字節數
    while(new_oneline_size%4)new_oneline_size++;//按4字節對齊
    int i,j;
    int offset_count=0;
    int rgb=0;  
    int cnt=0;
    unsigned char buff[new_oneline_size];//存放新圖片一行字節數
    for(i=0;i=0;j--)
        {
            //先讀取最后一行的第一個像素點
            offset_count=bmp_head.bfOffBits+i*3+j*befor_oneline_size;
            fseek(fp[0],offset_count,SEEK_SET);
            fread(&rgb,3,1,fp[0]);//讀取一個像素點數據
            buff[cnt++]=(rgb)&0xff;
            buff[cnt++]=(rgb>>8)&0xff;
            buff[cnt++]=(rgb>>16)&0xff;
        }
        fwrite(buff,cnt,1,fp[1]);//將一行顏色數據寫入到新文件中
        if(cnt!=new_oneline_size)//補全為4的整數倍
        {
            rgb=0;
            fwrite(&rgb,new_oneline_size-cnt,1,fp[1]); 
        }
    }
    fclose(fp[0]);
    fclose(fp[1]);
    return 0;
}
;i++)>
  • 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;

主函數

int main(int argc,char **argv)
{
    if(argc!=3)
    {
        printf("格式:./a.out \n");
        return 0;
    }
    int stat=0;
    char buff[20];
    stat=BMP_ClockWise_Revolve90(argv[1],argv[2]);//順時針90°
    if(stat)
        printf("[%s line %d] err %d\n",__FUNCTION__,__LINE__,stat);
    else 
    {
        snprintf(buff,sizeof(buff),"eog %s",argv[1]);//字符串拼接
        system(buff);//創建進程
    }
    stat=BMP_antiClockWise_Revolve90(argv[1],argv[2]);//逆時針旋轉90°
    if(stat)
        printf("[%s line %d] err %d\n",__FUNCTION__,__LINE__,stat);
    else 
    {
        snprintf(buff,sizeof(buff),"eog %s",argv[1]);//字符串拼接
        system(buff);//創建進程
    }

    return 0;
}

在對BMP圖片進行90°旋轉時需要注意的點:
??1.每一行的字節數,當行字節數不是4的倍數需要用0補齊
??2.旋轉后的圖片的寬=原圖片的高;新圖片的高=原圖片的寬

注:以上示例均在32位redHat6.3 linux下實現,若是64位linux系統需要注意結構體大小。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11230

    瀏覽量

    208933
  • 操作系統
    +關注

    關注

    37

    文章

    6742

    瀏覽量

    123192
  • BMP
    BMP
    +關注

    關注

    0

    文章

    48

    瀏覽量

    17044
收藏 人收藏

    評論

    相關推薦

    BMP圖片分析軟件

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

    bmp圖片轉換為PCB圖的軟件

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

    基于STM32芯片的LCD顯示屏的BMP圖片顯示

    基于STM32芯片的LCD顯示屏的BMP圖片顯示
    發表于 01-18 14:39 ?61次下載

    BMP圖片文件詳解

    BMP圖片文件詳解,很好的資料,快來學習吧
    發表于 02-18 14:16 ?0次下載

    LCD彩色圖片轉換工具BMP_to_H

    LCD彩色圖片轉換工具BMP_to_H
    發表于 12-28 10:16 ?11次下載

    基于STM32的BMP圖片的解碼系統

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

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

    編譯后拷貝進開發板即可使用使用方法./fb_show_bmp test.bmp顯示的圖片由參數指定,上面指令中test.bmp為測試用的bmp
    發表于 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圖片文件
    發表于 01-23 10:05 ?2次下載

    Linux應用開發-LCD顯示BMP圖片

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

    LinuxBMP圖片添加水印

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

    LinuxBMP圖片截圖

    BMP位圖格式理所當然地被廣泛應用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點–占用磁盤空間過大。所以,目前BMP在單機上比較流行。
    的頭像 發表于 08-18 17:09 ?1182次閱讀

    LinuxBMP圖片縮放

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

    Linux開發_文件目錄操作介紹、創建BMP圖片

    介紹C語言文件編程,創建BMP圖片BMP圖片結構介紹,介紹目錄接口編程,Makefile知識點。
    的頭像 發表于 09-17 15:44 ?1449次閱讀
    <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 ?1822次閱讀

    Linux開發_BMP圖片編程(翻轉、添加水印)

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