乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      通過編寫程序工具提取.pal調(diào)色板文件為Rgb/Yuv分量數(shù)據(jù)的文本保存

       西北望msm66g9f 2019-03-28

      一、前言


      到做工作記錄的時候,本節(jié)主要的工作有先保存pal調(diào)色板數(shù)據(jù)位位圖,再對位圖的數(shù)據(jù)結(jié)構(gòu)進行分析,再通過源碼對數(shù)據(jù)進行提取,最后通過程序運行進行演示結(jié)果。因為Win7和Win10系統(tǒng)保存后的位圖存在差異,在編寫程序時通過修改宏定義可以解決,同時寬、高也是宏定義配置的。

      開發(fā)需求:需要添加一種256等級的偽彩條,而且底層FPGA的接口為YVU數(shù)據(jù)接口,而市場部只給我提供了一個.pal的文件,什么是pal文件,可能相關(guān)資料比較少,度娘搜索關(guān)鍵字[pal+空格+調(diào)色板]可以看到一部分信息,具體怎樣的數(shù)據(jù)格式?jīng)]有去深究。任務(wù)的輸入文件如下圖,最終輸出為RGB/YVU分量數(shù)據(jù)的文本數(shù)據(jù)。

      用X86 PC的畫圖軟件打開該文件如下,可以看到是一些顏色漸變的過程,目的就是要把每個顏色等級的數(shù)據(jù)提取出來。

      筆者的思路是把pal文件用X86 PC(Win7和Win10)的畫圖軟件分別保存了24bit BMP格式的位圖(其他位的位圖沒研究過),Win7系統(tǒng)保存完之后如下(Win10同樣):

      查看這張位圖的屬性,可以看到一共256個顏色等級,每個等級的顏色寬度為25。satagr_win7為Win7系統(tǒng)保存出來的圖片(19K,顏色深度24位)。筆者在Win10系統(tǒng)上也用畫圖軟件也存了一張24Bit的位圖,有趣的是與Win7系統(tǒng)轉(zhuǎn)換的位圖不一樣,satagr_win10為Win10系統(tǒng)用畫圖軟件保存出來的位圖(25K,和原始的pal文件一樣大,顏色深度32位)。猜想是買個不同操作系統(tǒng)的畫圖軟件編碼bmp的實現(xiàn)不一樣吧。


      用UltrEdit打開該位圖,前面54個字節(jié)是BMP的標準,可以發(fā)現(xiàn)數(shù)據(jù)是倒著放的(第一行的顏色數(shù)據(jù)在文件最后,最后一行的數(shù)據(jù)在文件的開始),如下:

      紅色框的是最后一個顏色的數(shù)據(jù),Win7的顏色深度為24BIt,所以每個像素點顏色BGR每個顏色分量占用一個字節(jié),而每行的顏色以00結(jié)束,所以每行的數(shù)據(jù)為25*3+1個字節(jié)大?。欢鳺in10的顏色深度為32Bit,所以每個像素點顏色BGR占用4個字節(jié),沒個像素點以BGR的每個分量+FF,每個數(shù)據(jù)為BGR+FF(00 00 00 FF),在在畫圖軟件中我們可以看到該顏色剛好為位圖的最后一個顏色(黑色):


      再來驗證數(shù)據(jù)為什么是BGR排布,以及進一步確認數(shù)據(jù)是倒立放的,直接看位圖最開的顏色(紅色),數(shù)據(jù)如下:


      數(shù)據(jù)大小的計算:Win7_data = 54 +(25*3+1)*256 ==  19510字節(jié)(0x4C36);Win10_data = 54 + 25*4*256 == 25654字節(jié)(0x6436),和Linux系統(tǒng)顯示的一致


      把對應(yīng)的十六進制數(shù)據(jù)換算成十進制,然后在畫圖軟件就行驗證,如下:


      可以看到:

      32(50)  對應(yīng)的-----------------藍(U)

      0A(10)  對應(yīng)的-----------------綠(G)

      FA(250)對應(yīng)的-----------------紅(R)

      所以數(shù)據(jù)的排列是BGR+FF,同時位圖的最開始的顏色數(shù)據(jù)在文件的最后,因為把這50、10、250三個數(shù)據(jù)隨便怎么調(diào)換,只有上圖的順序才是紅色。文件數(shù)據(jù)的格式我們已經(jīng)知道了,下面就是編寫程序提取24Bit 位圖數(shù)據(jù)為RGB數(shù)據(jù);

      二、程序源碼的分享


      1、首先開辟一塊內(nèi)存,存放位圖的數(shù)據(jù)

      unsigned char* bmpBuf;bmpBuf = (char*)malloc(BMP_SIZE);if(bmpBuf == NULL){ printf('failed to allocate buff_in_bmp %s, %d\n', __FILE__, __LINE__); return -1;}
      int src_fd = open(INPUT_BMP_PATH, O_RDONLY );if( -1 == src_fd ) { printf('++++++open file failed %s,%d\n', __FILE__, __LINE__); return -1;}int read_size = read( src_fd, bmpBuf, BMP_SIZE);

      2、把每行對應(yīng)的顏色提取成RGB數(shù)據(jù),并以文本來保存。注意:①Win7和Win10不同的數(shù)據(jù)排版,對我們提取并沒有影響,只要按照對應(yīng)格式提取就行;②位圖中顏色分量的數(shù)據(jù)排列順序是以BGR排列的;③換行符在Linux和Window系統(tǒng)顯示是有區(qū)別的

      char str[25];FILE *fpRgb;if((fpRgb = fopen(OUTPUT_RGB_PATH,'w')) == NULL){   printf('cannot open this file %s, %d\n', __FILE__, __LINE__);   return -1;int i;for(i = 0; i< 256; i++){           sprintf(str,'\{%d, %d, %d\}\,',bmpBuf[54+i*BMP_PER_LINE_BYTE+2],bmpBuf[54+i*BMP_PER_LINE_BYTE+1],bmpBuf[54+i*BMP_PER_LINE_BYTE]);           if(fputs(str,fpRgb) == '\0'){             printf('cannot open file %s, %d\n', __FILE__, __LINE__);             return -1;             } #ifdef LINUX    fputs('\n',fpRgb);#else   fputs('\r\n',fpRgb);#endif}fclose(fpRgb);

      即在Linux輸出文本的換行符用

      fputs('\n',fpRgb);

      即在Windows輸出文本的換行符用

      fputs('\r\n',fpRgb);

      保存出來的文本形式如下:


      為什么要保存成這樣的格式呢,因為我的需求是一個二維的數(shù)據(jù),如下:


      如果想要其他格式的數(shù)據(jù)可以用sprintf函數(shù)自行構(gòu)造。當 “{” 與 “,”的格式與程序不匹配,可以用vim工具進行批量替換,指令是【:%s/被替換者/替換者/g】,演示如下:

      3、把對應(yīng)的RGB數(shù)據(jù)保存為YVU數(shù)據(jù)分量的文本,其中RGB轉(zhuǎn)YVU的公式度娘上大把:

      FILE *fpYuv;unsigned char y , u, v, r, g, b;if((fpYuv = fopen(OUTPUT_YUV_PATH,'w')) == NULL){ printf('cannot open this file %s, %d\n', __FILE__, __LINE__); return -1;} for(i = 0; i< 256; i++){         r = bmpBuf[54+i*BMP_PER_LINE_BYTE+2];          g = bmpBuf[54+i*BMP_PER_LINE_BYTE+1];         b = bmpBuf[54+i*BMP_PER_LINE_BYTE];                   y = ((77*r+150*g+29*b)>>8);         u = ((-43*r-85*g+128*b)>>8)+128;         v = ((128*r-107*g-21*b)>>8)+128;                  sprintf(str,'\{%d, %d, %d\}\,',y,u,v);         if(fputs(str,fpYuv) == '\0'){          printf('cannot open file  %s, %d\n', __FILE__, __LINE__);          return -1;         }#ifdef LINUX fputs('\n',fpYuv);#else fputs('\r\n',fpYuv);#endif}fclose(fpYuv);

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多