2016-08-04 17 views
-1
public static bool IsGrayscale(Bitmap bitmap) 
    { 
     return bitmap.PixelFormat == PixelFormat.Format8bppIndexed ? true : false; 
    } 

ビットマップから整数ルーチン生成例外

public static int[,] ToInteger(Bitmap image) 
    { 
     if (Grayscale.IsGrayscale(image)) 
     { 
      Bitmap bitmap = (Bitmap)image.Clone(); 

      int[,] array2d = new int[bitmap.Width, bitmap.Height]; 

      BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
                ImageLockMode.ReadWrite, 
                PixelFormat.Format8bppIndexed); 
      int bytesPerPixel = sizeof(byte); 

      unsafe 
      { 
       byte* address = (byte*)bitmapData.Scan0; 

       int paddingOffset = bitmapData.Stride - (bitmap.Width * bytesPerPixel); 

       for (int i = 0; i < bitmap.Width; i++) 
       { 
        for (int j = 0; j < bitmap.Height; j++) 
        { 
         int iii = 0; 

         //If there are more than 1 channels... 
         //(Would actually never occur) 
         if (bytesPerPixel >= sizeof(int)) 
         { 
          byte[] temp = new byte[bytesPerPixel]; 

          //Handling the channels. 
          //PixelFormat.Format8bppIndexed == 1 channel == 1 bytesPerPixel == byte 
          //PixelFormat.Format32bpp  == 4 channel == 4 bytesPerPixel == int 
          for (int k = 0; k < bytesPerPixel; k++) 
          { 
           temp[k] = address[k]; 
          } 

          iii = BitConverter.ToInt32(temp, 0); 
         } 
         else//If there is only one channel: 
         { 
          iii = (int)(*address); 
         } 

         array2d[i, j] = iii; 

         address += bytesPerPixel; 
        } 

        address += paddingOffset; 
       } 
      } 

      bitmap.UnlockBits(bitmapData); 

      return array2d; 
     } 
     else 
     { 
      throw new Exception("Not a grayscale"); 
     } 
    } 

例外は次の行に:

iii = (int)(*address); 

型 'System.AccessViolationException' の未処理の例外は、高速フーリエTransform.exe

で発生しました追加情報:しようとしました保護されたメモリを読み書きする。 これは、多くの場合、他のメモリが壊れていることを示します。

enter image description here

その例外の原因は何ですか?

どうすれば修正できますか?

P.S.私は、次のPNG画像を使用しています:あなたは、ループ内bitmap.Heightためbitmap.Widthを間違えている

enter image description here

+0

ポインタを直接使用するには、コードセクションを安全でないと宣言する必要があります。 – Kevin

+0

@ケビン、私はすでに安全でないと宣言しています。それ以外の場合は、実行してはいけません。 – anonymous

+0

サンプル画像を投稿できますか?私にとってコードはうまく動作しているので、 – technikfischer

答えて

2

。ストライドは画像全体の幅+画像のオフセットを表すので、外側のループの高さと内側のループの幅を反復する必要があります。次に、横断された各行の代わりに、paddingを行単位で追加することができます。したがって

for (int i = 0; i < bitmap.Height; i++) 
{ 
    for (int j = 0; j < bitmap.Width; j++) 
    { 

が機能しています。また、配列のアクセスをarray2d[i, j] = iiiからarray2d[j, i] = iiiにスワップする必要があります。インデックスは現在画像の他の次元に属しています。

+0

とマークしてください。また、一般的なルールとして、xとyをループするときには...ループ変数 'x'と' y'_を呼び出します。コードをもっと簡単にすることができます。 – Nyerguds

関連する問題