2013-08-02 3 views
1

Я пытаюсь написать код, который извлекает значения цвета пикселей для каждого пикселя в растровом файле. Для этой цели я импортировал BMP в качестве растрового объекта, и я использовал метод Bitmap.GetPixel (x, y), но для моего приложения он был недостаточно быстрым. Один из моих коллег дал мне совет; Я думаю, что я могу использовать fopen, чтобы открыть сам файл, проанализировать байтовые данные в массиве. Есть ли у вас какие-либо идеи? Использование метода fopen не обязательно, я могу использовать что угодно.Bitmap to byte [] using Fopen

Заранее спасибо.

+0

Это не так просто. Вам нужно преобразовать различные форматы в целевой формат из необработанных данных, и это непростая задача. По крайней мере, насколько я знаю. Вы можете использовать 'byte [] data = System.IO.File.ReadAllBytes ('file.bmp')' для получения ваших данных, но я говорил об форматировании. – MahanGM

+0

Функция fopen() не работает быстрее или отличается от FileStream или File.ReadAllBytes() или Image.FromFile(). Сосредоточьтесь на использовании небезопасных указателей, * это * альтернатива GetPixel(). Используйте Bitmap.LockBits(), есть тонна хитов google. –

ответ

2

Вы можете использовать либо небезопасный кодовый блок, либо использовать Marshal class. Я бы решил так:

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

    //PixelFormat.Format24bppRgb => B|G|R => 3 x 1 byte 
    //Lock the image 
    BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
    // 3 bytes per pixel 
    int numberOfBytes = width * height * 3; 
    byte[] imageBytes = new byte[numberOfBytes]; 

    //Get the pointer to the first scan line 
    IntPtr sourcePtr = bmpData.Scan0; 
    Marshal.Copy(sourcePtr, imageBytes, 0, numberOfBytes); 

    //Unlock the image 
    bitmap.UnlockBits(bmpData); 

    return imageBytes; 
} 
+0

Это был первый ответ, и он отлично работал. Спасибо. Но я не мог понять, что такое класс маршала, и что делает метод блокировок, не могли бы вы объяснить их кратко? – talkanat

+1

1, Lockbits => Во время жизни объектов их положение в памяти может быть изменено, например, после сбора мусора. Чтобы предотвратить это поведение, битмап заблокирован/зафиксирован в памяти. Я думаю, что это работает как фиксированное утверждение. 2, Маршал - статический класс с множеством методов для взаимодействия между управляемым и неуправляемым кодом, выделения неуправляемой памяти и т. Д. – boli