2016-08-04 8 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 изображения:

enter image description here

+0

Чтобы напрямую использовать указатели, вы должны объявить секцию кода небезопасной. – Kevin

+0

@ Кевин, я уже объявил это небезопасным. В противном случае он не должен работать. – anonymous

+0

Можете ли вы разместить пример картинки? Потому что для меня код работает нормально – technikfischer

ответ

2

Вы ошиблись bitmap.Width для bitmap.Height в ваших петель. Вы должны перебирать высоту во внешнем цикле и по ширине во внутреннем цикле, поскольку шаг представляет всю ширину + смещение изображения. Затем вы можете добавить 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 ... _call переменные цикла 'x' и' y'_ , Это делает код намного более простым. – Nyerguds