在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

Linux下BMP圖片縮放

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-08-18 17:14 ? 次閱讀

Linux下BMP圖片縮放

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

本示例主要實現24位真彩色BMP圖片的放大與縮小。采用的縮放算法為雙線性插值。

雙線性插值參考鏈接:https://blog.csdn.net/weixinhum/article/details/38963705

  • 原始圖片
  • 放大示例
[xsw@xsw BMP_stady]$ ./a.out 1.bmp watermark.bmp 
	源圖片寬:504
	源圖片高:314

	請輸入要放大或縮小的倍數(放大為正數,縮小為負數):-1
放大或縮小的比例超出范圍,請重新輸入!

	請輸入要放大或縮小的倍數(放大為正數,縮小為負數):0.5
	新圖片寬:756
	新圖片高:471
	縮放比例:150%
[xsw@xsw BMP_stady]$ 
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center
  • 縮小示例
[xsw@xsw BMP_stady]$ gcc zoom.c 
[xsw@xsw BMP_stady]$ ./a.out 
格式:./a.out 
[xsw@xsw BMP_stady]$ ./a.out 1.bmp watermark.bmp 
	源圖片寬:504
	源圖片高:314

	請輸入要放大或縮小的倍數(放大為正數,縮小為負數):-0.25           
	新圖片寬:378
	新圖片高:235
	縮放比例:75%
[xsw@xsw BMP_stady]$ ??

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center
  • 縮放示例代碼
/*****************************BMP圖片放大縮小************************
**
**形參:const char *new_bmp -- 縮放后的圖片名
**     const char *socure_bmp  -- 源圖片名
**返回值:0 -- 成功; 其它值 -- 失敗
*********************************************************************/
int BMP_ZoomInandOut(const char *new_bmp,const char *socure_bmp)
{
    FILE *fp[2];
    fp[0]=fopen(socure_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]);//讀取頭數據
    if(bmp_head.bfType!=0x4d42)
    {
        printf("[%s line %d]圖片格式錯誤\n",__FUNCTION__,__LINE__);
        fclose(fp[0]);
        fclose(fp[1]);
        return 3;
    }
    fread(&bmp_info,sizeof(BMP_INFO),1,fp[0]);//讀取位圖數據
    unsigned long w,h;
    w=bmp_info.biWidth;//源圖片寬
    h=bmp_info.biHeight;//源圖片高
    printf("\t源圖片寬:%d\n",w);
    printf("\t源圖片高:%d\n",h);
    unsigned long oneline_byte=w*3;
    while(oneline_byte%4)oneline_byte++;//源圖片一行字節(jié)數,不是4的倍數補全
    float zoom_count=0;
pp:
    printf("\n\t請輸入要放大或縮小的倍數(放大為正數,縮小為負數):");
    scanf("%f",&zoom_count);
    if(zoom_count<=-1|| zoom_count>4)
    {
        printf("放大或縮小的比例超出范圍,請重新輸入!\n");
        goto pp;
    }
    bmp_info.biWidth=(1+zoom_count)*w;//新圖片寬
    bmp_info.biHeight=(1+zoom_count)*h;//新圖片高
    unsigned long new_w=bmp_info.biWidth;//新圖片寬
    unsigned long new_h=bmp_info.biHeight;//新圖片高
    printf("\t新圖片寬:%d\n",new_w);
    printf("\t新圖片高:%d\n", new_h);
    printf("\t縮放比例:%.0f%%\n",(new_w*1.0/w)*100);
    unsigned long new_oneline_byte=new_w*3;
    while(new_oneline_byte%4)new_oneline_byte++;//新圖片一行字節(jié)數,不是4的倍數補全
   // printf("新圖片一行字節(jié)數:%d\n",new_oneline_byte);

    bmp_head.bfSize=new_oneline_byte*new_h+sizeof(BMP_HEADER)+sizeof(BMP_INFO);//圖片總大小
    bmp_info.biSizeImage=new_oneline_byte*new_h;//位圖大小
    fwrite(&bmp_head,sizeof(BMP_HEADER),1,fp[1]);//頭數據寫入到新的文件中
    fwrite(&bmp_info,sizeof(BMP_INFO),1,fp[1]);//位圖數據寫入到新的文件中

    unsigned char *newbmp_buff=(unsigned char *)malloc(new_h*new_oneline_byte);//動態(tài)分配新圖片RGB顏色數據緩沖區(qū)
    if(newbmp_buff==NULL)
    {
        printf("[%s line %d]動態(tài)分配空間失敗\n",__FUNCTION__,__LINE__);
        fclose(fp[0]);
        fclose(fp[1]);
        return 4;
    }
    memset(newbmp_buff, 0, new_h*new_oneline_byte);
    unsigned char *bmp_buff=(unsigned char *)malloc(h*oneline_byte);//動態(tài)分配新圖片RGB顏色數據緩沖區(qū)
    if(bmp_buff==NULL)
    {
        printf("[%s line %d]動態(tài)分配空間失敗\n",__FUNCTION__,__LINE__);
        fclose(fp[0]);
        fclose(fp[1]);
        return 5;
    } 
    memset(bmp_buff, 0, h*oneline_byte);
    unsigned long   rgb_data_size=0;
    rgb_data_size=h*oneline_byte;//源圖片RGB顏色數據字節(jié)大小
    fseek(fp[0],bmp_head.bfOffBits,SEEK_SET);//將文件指針偏移到RGB數據處
    fread(bmp_buff,rgb_data_size,1,fp[0]);//讀出所有顏色數據

    /************************圖像處理算法(雙線性插值)*******************************/
    int i,j;
    for(i=0;i;i++)>
  • 主函數
int main(int argc,char **argv)
{
     if(argc!=3)
    {
        printf("格式:./a.out \n");
        return 0;
    }
    int stat=0;
    char buff[20];
    stat=BMP_ZoomInandOut(argv[1],argv[2]);
    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位圖結構體
//位圖文件頭信息結構定義    
 #pragma pack(1) 
typedef struct tagBITMAPFILEHEADER {
	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數據偏移地址,位圖數據的起始位置,以相對于位圖(11-14字節(jié),低位在前)//文件頭的偏移量表示,以字節(jié)為單位 
} BMP_HEADER;
//信息頭BITMAPINFOHEADER,也是一個結構,其定義如下:  
typedef struct tagBITMAPINFOHEADER {
	unsigned long  biSize;      //本結構所占用字節(jié)數(15-18字節(jié))
	unsigned long  biWidth;     //位圖的寬度,以像素為單位(19-22字節(jié))
	unsigned long  biHeight;    //位圖的高度,以像素為單位(23-26字節(jié))
	unsigned short biPlanes;    //目標設備的級別,必須為1(27-28字節(jié))
	unsigned short biBitCount;   //每個像素所需的位數,必須是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;  //位圖的大小(其中包含了為了補齊行數是4的倍數而添加的空字節(jié)),以字節(jié)為單位(35-38字節(jié))
	unsigned long  biXPelsPerMeter;//位圖水平分辨率,每米像素數(39-42字節(jié))
	unsigned long  biYPelsPerMeter;//位圖垂直分辨率,每米像素數(43-46字節(jié))
	unsigned long  biClrUsed;      //位圖實際使用的顏色表中的顏色數(47-50字節(jié))
	unsigned long  biClrImportant; //位圖顯示過程中重要的顏色數(51-54字節(jié))
} BMP_INFO;
  • 注:本示例運行環(huán)境為32位redHat6.3 linux下實現,若是64位linux系統需要注意結構體大小。

審核編輯:湯梓紅

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

    關注

    87

    文章

    11345

    瀏覽量

    210391
  • WINDOWS
    +關注

    關注

    4

    文章

    3569

    瀏覽量

    89303
  • 操作系統
    +關注

    關注

    37

    文章

    6892

    瀏覽量

    123742
  • BMP
    BMP
    +關注

    關注

    0

    文章

    48

    瀏覽量

    17090
收藏 人收藏

    評論

    相關推薦

    使用emwin解碼bmp圖片,為什么放大顯示不行?

    _Draw(_rx_BmpBuff,_usX,_usY);//在指定位置顯示BMP圖片 } else //否則圖片需要縮放 { GUI_BMP
    發(fā)表于 04-29 06:00

    請問解碼BMP圖片程序在哪?

    {GUI_BMP_DrawEx(BmpGetData,&BMPFile,x,y);//在指定位置顯示BMP圖片}else //否則圖片需要縮放
    發(fā)表于 09-24 01:57

    BMP圖片分析軟件

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

    bmp圖片轉換為PCB圖的軟件

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

    BMP圖片文件詳解

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

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

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

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

    編譯后拷貝進開發(fā)板即可使用使用方法./fb_show_bmp test.bmp顯示的圖片由參數指定,上面指令中test.bmp為測試用的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應用開發(fā)-LCD顯示BMP圖片

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

    LinuxBMP圖片添加水印

    BMP是英文Bitmap(位圖)的簡寫,它是Windows操作系統中的標準圖像文件格式,能夠被多種Windows應用程序所支持。隨著Windows操作系統的流行與豐富的Windows應用程序的開發(fā)
    的頭像 發(fā)表于 08-16 11:20 ?1304次閱讀
    <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在單機上比較流行。
    的頭像 發(fā)表于 08-16 11:27 ?1435次閱讀
    <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在單機上比較流行。
    的頭像 發(fā)表于 08-18 17:09 ?1280次閱讀

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

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

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

    介紹BMP圖片上下翻轉、添加水印、通過學習BMP圖片結構學習文件編程。
    的頭像 發(fā)表于 09-17 15:43 ?1954次閱讀

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

    接收BMP圖片編程,完成BMP圖片翻轉、水印添加等知識點。
    的頭像 發(fā)表于 09-17 15:33 ?1606次閱讀
    <b class='flag-5'>Linux</b>開發(fā)_<b class='flag-5'>BMP</b><b class='flag-5'>圖片</b>編程(翻轉、添加水印)
    主站蜘蛛池模板: 国产精品久久久久免费 | 色依依视频视频在线观看 | 天天色踪合合 | 久久影视免费体验区午夜啪啪 | 35pao免费视频 | 手机在线观看一级午夜片 | 色综合视频在线观看 | 精品综合久久88色鬼首页 | 手机在线电影你懂的 | 成人性欧美丨区二区三区 | 李老汉和小花的性生生活 | 深夜视频在线播放视频在线观看免费观看 | 天堂网在线观看 | 秋霞一级特黄真人毛片 | 四虎tv在线观看884aa | 400部大量精品情侣网站 | 久久成人影视 | 国内色综合精品视频在线 | 日韩黄a级成人毛片 | 1000部啪啪未满十八勿入 | 天天在线精品视频在线观看 | 色偷偷免费视频 | 毛片录像 | 亚洲丰满熟妇毛片在线播放 | 亚洲一区二区三区在线网站 | 五月天婷婷在线视频 | 亚洲乱亚洲乱妇41p国产成人 | 国产逼逼视频 | 欧美色淫网站免费观看 | 全日本爽视频在线 | 94久久国产乱子伦精品免费 | 日本在线视频二区 | 手机看片中文字幕 | 日韩中文电影 | www.一区二区三区.com | 天天操夜夜草 | 久久久噜久噜久久gif动图 | 久久精品隔壁老王影院 | 亚洲精品综合网在线8050影院 | 久久国内精品 | 免费播放视频 |