説明BMP画像データ

                                           説明BMP画像データ

説明BMP
BMPは、非圧縮形式であり、画像ファイルは、一般的に大きく、操作を描画画像のそれぞれの内部のWindowsシステムはBMPに基づいて、ビットマップ、ビットマップの略語です。

 

BMP画像が構成される
4つの部分から成るBMPファイル:
ヘッダー情報、固定サイズ、構造参照BitmapFileHeader画像情報ヘッダ、固定サイズを、異なるサイズのビット数に応じて、任意BITMAPINFOHEADERパレット構造を参照。RGBビットマップデータは、メジアン径は、一態様に従って計算することができます。


BMPデータ構造

typedef unsigned short U16;
typedef unsigned long  U32;
typedef struct tagBitmapFileHeader
{

    U16 bfType;         /* windows下该值必需是0x4D42,即字符'BM'*/
    U32 bfSize;         /* bmp文件大小,包含bmp文件头,信息头,调色板大小,数据大小 */
    U16 bfReserved1;    /* 保留,必须设置为0 */
    U16 bfReserved2;    /* 保留,必须设置为0 */
    U32 bfOffBits;      /* rgb数据相对文件头偏移量 */
} BitmapFileHeader;



typedef struct
{

    U32 biSize;         /* 信息头大小sizeof(BitmapInfoHeader) */
    U32 biWidth;        /* 图象的宽度,以象素为单位 */
    U32 biHeight;       /* 图象的高度,以象素为单位,正值倒向位图,负值正向位图 */
    U16 biPlanes;       /* 位面数,设为1 */
    U16 biBitCount;     /* 位图位数,可以为32,24,16,8,4,1 */
    U32 biCompression;  /* 说明图象数据压缩的类型,BI_RGB(0) BI_BITFIELDS(3)等 */
    U32 biSizeImage;    /* 图像数据大小,包括位图信息大小和数据大小 */        
    U32 biXPelsPerMeter;/* 水平分辨率,一般可填0 */    
    U32 biYPelsPerMeter;/* 垂直分辨率,一般可填0*/
    U32 biClrUsed;      /* 颜色索引使用数,一般填0,表示都使用 */
    U32 biClrImportant; /* 重要颜色索引数,一般填0,表示都重要 */

} BitmapInfoHeader;

データ算出長さ:
INT iLineByteCnt =(((biWidth biBitCount *)+ 31)>> 5)<< 2;
iRGBDataSize * = iLineByteCntのbiHeight;
右31 5を追加する前に、作業データライン4バイトアライメントを行う。この式(32を除く)ビットが作業を行うために整列され、バイトにターン(4逓倍)は、2つを残しました。biBitCountとbiCompression
24ビットカラー及び32ビットカラーbiBitCountセグメント24及び32、biCompressionのいずれかBI_RGBに固定され、画素は3および4バイトを占める。
16ビットカラー、biBitCount 16は、各画素は、2つのバイトを占有します、RGBの位置を示す2つのバイトは、多くの場合、いずれかBI_RGB biCompressionに分割され、最上位ビットが0、RGBの半分および図5に示すように、パレット情報なしで、この16ビットカラーフォーマットであり、RGB555フォーマットとして示します。biCompression BI_BITFIELDSマスクを使用する実施形態を示している場合、12バイト(3 INT)BITMAPINFOHEADERバックされており、それぞれRGB用マスク、フォーマット555、次0x7C00,0x03E0,0x001F、565形のマスクであります:0xF800,0x07E0,0x001F、非常に柔軟な方法マスクは、このようなRGB844などの独自の16ビットカラーフォーマットを定義することができ、もちろん、ほとんど意味を有します。
#pragma pack(2)を使用してBitmapFileHeader構造が整列4バイトではありません、ノート、または:BMPデータ構造は、パレット情報は、変数項目比較的簡単ですが、他は固定されており、扱いやすい、ノートにはいくつかのものがあります__attribute __((整列(2) )) 2を直接整列される方法。RGBデータは、一般的に逆の順序で格納されたBMPの画像ライン、逆フィルを充填する際に注意を払います。

 

  • BitmapFileHeader構造は4バイトアライメントではない、それはの#pragmaパック(2)または__attribute __((整列(2)))2を直接整列される方法を使用して注目されます。
  • RGBデータは、一般的に逆の順序で格納されたBMPの画像ライン、逆フィルを充填する際に注意を払います。
  • 8グレースケール画像パレット情報、およびBMPパレット情報を24ビットされていません

BMPターンYUV

YUV、およびBMPフォーマットは非圧縮であり、復号処理のみ画素の変換画素に必要存在し、YUVよりBMP式ターン、異なるシナリオに適用されない、以下のITU-R BT.601は、デジタルビデオで使用するために推奨されます(ガンマ補正、画像強調を有する)式: 

R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)
B' = 1.164*(Y’-16) + 2.017*(Cb'-128)

 効果は確かに最高ですが、また、計算の最大量、組込み機器に使われている場合は、次の簡素化の式を使用することができます。

R = Y + 1.4075 *(V-128)
G = Y – 0.3455 *(U –128) – 0.7169 *(V –128)
B = Y + 1.779 *(U – 128)

 浮動小数点演算に成形、計算効率を改善するために、コード式を実装する際に必要な、式(右20,20統一第1の左)形式に変換することができます。

R = (Y<<20 + 1475871 *(V-128)) >> 20
G = (Y<<20 – 362283 *(U –128) – 751724 *(V –128)) >> 20
B = (Y <<20 + 1865417 *(U – 128)) >> 20

 YUVの各成分が乗算を低減するために、(0〜255)を格納するために1バイト(YUV420フォーマットUV成分が再利用される)、各値の範囲を使用するので、乗算部は、部分的であってもよいルックアップ次のように、メソッドを実装し:

int V1475871[256] = {0};
int V751724[256] = {0};
int U362283[256] = {0};
int U1865417[256] = {0};

for (i = 0; i < 256; i++)
{
    V1475871[i] = (i - 128) * 1475871;
    V751724[i] = (i - 128) * 751724;
    U362283[i] = (i - 128) * 362283;
    U1865417[i] = (i - 128) * 1865417;

}

/* 使用局部查表法,公式转成如下形式: */
R = (Y<<20 + V1475871[V]) >> 20;
G = (Y<<20 – U362283[U] – V751724[V]) >> 20;
B = (Y <<20 + U1865417[U]) >> 20;

 24ビットカラー及び32ビットカラールックアップテーブルは、一般に、16ビットのカラールックアップテーブルが完全に使用することができるならば、完全にコストがかかりすぎるを使用してローカル、メモリルックアップテーブルの効率を最適化するために使用されます。
乗算演算を最適化するローカルルックアップテーブル、最適化の効果が(約10%プラットフォームのテスト結果を複数)に制限されます。

49元記事公開 ウォンの賞賛138 ビューに30万+を

おすすめ

転載: blog.csdn.net/lz0499/article/details/101073436