BMPファイル形式、RGB間のフォーマット変換はピット、MARKを打ちます

ダンプ・BMPファイルで多くの人々が、さまざまな問題があるだろう場合は特に、画面キャプチャ、多くの場合、保存奇妙な絵、大きな偏差!次のような:

 

 時には、明らかに彼は右であることを感じ、その結果は、多くの場合、人々は狂った駆動します。

この状況は、一般的にBMPファイル形式は理解していないか、またはほとんどが右にあるので、もちろん、徹底した、あるいは少なくともショーアップにはなりませんが、何かが間違っています!

そこに多くのオンラインBMPファイル形式がありますが、それらは十分にそれが徹底入れ、実際の合計は、いくつかの迂回路を行く起こします。

 

BMPは、一般的な画像フォーマットが広く使用されています。BMP形式の下で学ぶためにUIライブラリを扱うとき最近、またピット、記録の一部で発見。

BMP形式は単純で、オンラインもWikipediaで説明した杭を、検索し、私は、ここでは繰り返しません

最も重要な文書は最初、主に最初の54バイトで、UEは、BMPを見ることができます。

 

 

注意:

1.赤いボックスの内容が鍵となります

2.数値、後ろのピクセルを含む、前面下部です。例えば、RGB888順序は実際BGR888が格納されています

 

カラー:いくつかの標準がありますが、RGBを理解することは非常に簡単の一般的なものなので、焦点は、標準のRGBカラーを下回っています。

 

あまりにも4色、黒と白、16色、256色、色の歪みいるので、特別な行事を除いて、今ほとんど使用されないので、私は試してみませんか。

256色のため、実際には、製図板の概念があり、あなたは写真の品質を向上させることができ、保管スペースを削減し、興味を持っている次を見つけるために行くことができます

 

16ビットカラー24ビットカラー:それに焦点を当てます

違いに注意してください:16色と16ビット色、16色、16色であり、非常に単調な、16ビットカラー、65,536色、豊かで表される16ビットカラー、。

24は色を表すために24ビットカラーで、次いで、256×256×256色があり、色がより豊かな、ほとんどの通常の使用を満たします。

        とてもよく24ビットカラーので、なぜ私たちは、16ビットカラーを使用していますか?さらに低い色?主な用途は、まだかなりの市場、別の色当然の悪い方のパフォーマンスの結果、桁数と同じではありませんが、あまり収納スペースを占め、それはより高速な処理、表示要件は場所ではそれほど高くはないことを意味します表示オブジェクトも限定されて、人々は古い画面がモノクロであるので、色の無い量、最終的に0または1ということを知っている必要がありますがありますしている、カラー画面のその後の出現が、色はまた、非常に少ないので、いくつかが、モノクロよりも優れていますより良い効果;後で本当の色が登場、その後、それはより多くの鮮やかな色の後に、当然のことながら、私たちは888の年齢を入力することができます。要するに、色は、お使いのデバイス/処理能力/ハードウェアコストに依存します。

 

カラーRGB888は24 = 8 + 8 + 8である前に、彼は言いました

16ビット色は?RGB565は、= 5 + 5 + 6、そこRGB555 = 5 + 5 + 5、より一般的なRGB565。

 

我々は、多くの場合、RGB565を使用し、機器が、「私たちの画像コンピュータで図32ビットのデータ、すなわち、RGB888 +アルファ、アルファスタッフバイトが半透明である......の各画素24に格納されたRGB888フォーマットの画像です」したがって、両者の間には、ここでは繰り返さないが、それは非常に簡単です、オンライン変換アルゴリズム、多くのことを変換します。

 

もちろん、実際にはそう単純ではない、私は、ピットにより、このようなピットが発生したBMP形式をよく理解していました。

私はあなたが気づいていない、ここの意味で001EH BMP形式を知りません。

            0 - 圧縮なし(BI_RGBを使用して表されます)

      1 - (BI_RLE8で示す)RLE 8- 8ビットRLE圧縮

      2 - (BI_RLE4で示す)RLE 4- 4ビットRLE圧縮

      3 - (BI_BITFIELDSによって示される)Bitfields-ビットフィールドのストレージモードは、一般的にビット12とbit32使用され、ここでの鍵です!フォーカス!フォーカス!フォーカス!

 

ターゲットファイルは001E 3を埋めるので、ここで、RGB565,16bitですので、0を埋めないように注意してください!0を埋めないように注意してください!0を埋めないように注意してください!

そして、3それをOKするかどうかを埋めますか?ありません!16ビットなので、そこにRGB565およびRGB555 2つの規格が、あなたはどのような形式でお互いを伝える必要があります!それ以外の場合は、愚かなシステム!

だから、どのようにシステムを教えて?私たちは、元の54バイト、16バイトのメイン含有量が増加した後、いくつかの情報を追加する必要があります。

赤色プレースホルダ充填するRGB565:0x0000F800の
グリーンプレースホルダRGB565を充填する:0x000007E0は
青色充填するRGB565を占める:0x0000001Fを
伴う70バイトに、オフセット/長さの変化は、ローカル値を反映するよう

場所があります:000EH 0x38で埋めるために、ここで、16の増加になるこの場所は!

 

それがRGB555であればこのように、そして、これらの場所を変更する必要が

 

 

そこでは、ピットは4バイトのアライメントにBMPでもあり、よく理解されていましたが、実際にそれがあります

「各行は不十分00Hで満たされ、4バイトアライメントにありました」

例えば:

RGB565(2バイトのピクセル):画像は51 * 51の形式である場合

行あたりのバイト数= 51 * 2 = 102バイト、102は104バイトとなるようので、両方00を補償するために、4の倍数ではありません=

 

ここで私はBMPの機能を作成するために頭を与える通常それはRGB565 RGB888で使用されているので、あなたは、あなた自身のBMPヘッドを実装することができます興味を持って次のコードを向上させることができれば2種類がそれをより多目的にするために、他のタイプを考慮していません!

  1  // pTitle作成、70バイトの固定された
   2つの // 例えば24 16としてbyBitsディジットを、
   3  // nWidth画像の幅(画素数)
   。4  // nHeight画像高さ(画素数)
   。5  // nFileLen総画素画像* nHeight nWidth点= 
  6  ボイド CreateBmpTitle(バイト * pTitle、バイトbyBits、UINT nWidth、UINT nHeight、UINT nFileLen)
   7。 {
   8つの。     int型のNPO = 0 ;
   9      のmemset(pTitle、070 );
 10   
。11      // 各画素についてどのくらいのバイトの
12      バイト bmpBytes =2 ;
13      であれば(byBitsが<= 8 14      {
 15          bmpBytes = 1 16      }
 17      そう であれば(byBits <= 16 18      {
 19          bmpBytes = 2 20      }
 21      そう であれば(byBits <= 24 22      {
 23          bmpBytes = 3 24      }
 25      他の
26      {
 27         = bmpBytes 4。;
 28      }
 29   
30      // 各行が一緒にされなければならない4。
31である      UINT nLineLen nWidth * = bmpBytes;
 32      IF((nLineLenの%4。 )!= 0 33であり     、{
 34は          UINT NADD =(4 - (nLineLenの%4。))* nHeight;
 35          nFileLen + = NADD;
 36      }
 37   
38である      pTitle [NPOS ++] = ' B ' ;
 39      pTitle [NPOS ++] = ' M' ;
 40   
41であり     、// ファイルの長さ
42は      SetUINT_L(nFileLen + 70 、pTitle、NPOS);
 43である      NPOの+ = 8 ; // 予約4スキップ
 44はある  
45      // オフセット
46である      SetUINT_L(70 、pTitle、NPOなど);
 47      NPOS + = 4 ;
 48の  
49の     // 窓、56は
50      SetUINT_L(56は、NPOS pTitle);
 51である      のNPO + = 4 ;
 52は、  
53である     // 
54     SetUINT_L(nWidth、pTitle、NPOなど);
55      NPOS + = 4 56      // 高度
57      SetUINT_L(nHeight、pTitle、NPOなど);
58      NPOS + = 4 59      // 平面数= 1 
60      SetUSHORT_L(1 、pTitle、NPOなど);
61      NPOS + = 2 ;
62の  
63      // 数ビット
64      SetUSHORT_L((USHORT)byBits、pTitle、NPOなど);    
65      NPOS + = 2 ;
66   
67      であれば(byBitsの== 24 68      {
69          NPOS + = 4 ;
 70      }
 71である      IF((byBits == 16)||(byBits == 15)||(byBits == 32 ))
 72      {
 73である         // BI_BITFIELDS 
74          (SetUINT_L 。3 、pTitle、NPOS) ;
 75          NPOS + = 4 ;
 76      }
 77   
78      // コンテンツの長さ、4の倍数でなければならない
79      SetUINT_L(nFileLen、pTitle、NPOS);
 80件      のNPO + = 4 ;
 81   
82     SetUINT_L(0xb12 、pTitle、NPOS);
 83件      のNPO + = 4 ;
 84   
85      SetUINT_L(0xb12 、pTitle、NPOS);
 86件      のNPO + = 4 ;
 87   
88      IF(byBits == 16 89      {
 90          // それぞれ565 RGBビットのビット
91である          のNPO = 54であり92   
93          SetUINT_L(0xF800 、pTitle、NPOS);
 94件          のNPO + = 4 ;
 95   
96          SetUINT_L(0x07E0 、pTitle、NPOS);
 97件          のNPO + = 4 ;
 98   
99          SetUINT_L(0x001F 、pTitle、NPOS);
 100件          のNPO + = 4 ;
 101      }
 102   
103   
104      /// 他方はゼロで
105 }

 

おすすめ

転載: www.cnblogs.com/winafa/p/11652343.html