2016-05-10 15 views
2

に抽出してみましょう。私は、ヘッダなしの生のビットマップデータを含むバイトの配列を持っています。
ビットマップデータをビット奇妙ですが、私はかなりよく分からないが、幅が、私は、BMPを構築するために、次のコードを使用NPOT(二つのないパワー)ビットマップデータをバイト配列

であれば、ビットマップデータが正しく整列されていないようですこのようなビットマップデータから:

public Bitmap GetBitmap(byte[] bitmapData, int width, int height) 
{ 
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format16bppRgb555); 
    Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 
    BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat); 
    unsafe 
    { 
     byte* ptr = (byte*)bmpData.Scan0; 
     for (int i = 0; i < bitmapData.Length; i++) 
     { 
      *ptr = bitmapData[i]; 
      ptr++; 

      if (width % 2 != 0) 
      { 
       if ((i + 1) % (width * 2) == 0 && (i + 1) * 2 % width < width - 1) 
       { 
        ptr += 2; 
       } 
      } 
     } 
    } 

    bitmap.UnlockBits(bmpData); 
    return bitmap; 
} 

これまでのコードは正常に動作します。しかし、何らかの理由で「ビットマップの読み込み」を実装する必要があります。つまり、ビットマップのインスタンスから「奇妙な」ビットマップデータを取得する必要があります。

どうすればよいですか?

答えて

2

最後に、これを行う方法を説明します。

私はMarshal.Copyを経由して、バイトの配列に最初のデータをコピーすることを決定した後、幅がNPOTであれば、いくつかのポイントをスキップしながら、バイトの別の配列にコピーします:

public byte[] ImportBitmap(Bitmap bitmap) 
{ 
    int width = bitmap.Width, height = bitmap.Height; 

    var bmpArea = new Rectangle(0, 0, width, height); 
    var bmpData = bitmap.LockBits(bmpArea, ImageLockMode.ReadWrite, PixelFormat.Format16bppRgb555); 
    var data = new byte[bmpData.Stride * Height]; 

    Marshal.Copy(bmpData.Scan0, data, 0, data.Length); 
    bitmap.UnlockBits(bmpData); 
    bitmap.Dispose(); // bitmap is no longer required 

    var destination = new List<byte>(); 
    int leapPoint = width * 2; 
    for (int i = 0; i < data.Length; i++) 
    { 
     if (width % 2 != 0) 
     { 
      // Skip at some point 
      if (i == leapPoint) 
      { 
       // Skip 2 bytes since it's 16 bit pixel 
       i += 1; 
       leapPoint += (width * 2) + 2; 
       continue; 
      } 
     } 

     destination.Add(data[i]); 
    } 

    return destination.ToArray(); 
}