2012-04-30 14 views
0

私はAForge.NETフレームワークを使用してプロジェクトを開発しています。私のプロジェクトでは、私はグレイスケールのビットマップから2Dバイト配列を取得しようとしていました。このサイトおよび他のフォーラムには、この件に関するいくつかのソリューションが掲載されています。しかし、私は本当の結果を得ていない。たとえば、私はそのコードを使用しました:C#でビットマップを2Dバイト配列に変換しますか?

public static byte[] ImageToByte2(Image img) 
{ 
    byte[] byteArray = new byte[0]; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     img.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
     stream.Close(); 

     byteArray = stream.ToArray(); 
    } 
    return byteArray; 
} 

この「MemoryStream」メソッドの後、私はこのバイト配列を2Dに変換することを考えました。しかし、このコードサンプルを4 * 8ビットマップでテストすると、1100の値がbyteArrayに返されます。それは普通ですか?どこに行方不明ですか?

答えて

1

.NET Imageクラスは、BitmapイメージとMetafileイメージの2種類のイメージのインターフェイスとして機能します。後者は、ビットマップのようなピクセルの配列ではなく、何かを描く一連の命令で構成されています。 Bitmap class itselfをご覧になる場合は、LockBitsの方法があり、画像のピクセルデータを抽出することができます。 Bitmapクラスのリンク先の一番下には、これを行う方法の例もあります。

0

次のメソッドを使用してください

public static byte[,] ImageTo2DByteArray(Bitmap bmp) 
    { 
     int width = bmp.Width; 
     int height = bmp.Height; 
     BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 

     byte[] bytes = new byte[height * data.Stride]; 
     try 
     { 
      Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); 
     } 
     finally 
     { 
      bmp.UnlockBits(data); 
     } 

     byte[,] result = new byte[height, width]; 
     for (int y = 0; y < height; ++y) 
      for (int x = 0; x < width; ++x) 
      { 
       int offset = y * data.Stride + x * 3; 
       result[y, x] = (byte)((bytes[offset + 0] + bytes[offset + 1] + bytes[offset + 2])/3); 
      } 
     return result; 
    } 
関連する問題