Ну, вы всегда можете использовать метод GDI +.
Bitmap b = new Bitmap( "some path" );
Color x = b.GetPixel( x, y );
Однако GetPixel на самом деле довольно медленный. Попробуйте сначала, но если вам нужно отсканировать много относительно больших изображений, это может не сработать. В этом случае используйте LockBits, чтобы получить указатель на непрерывный кусок памяти. Затем вы можете быстро пройтись по изображению, но вы должны знать, как манипулировать указателями, хотя это не очень сложно.
РЕДАКТИРОВАТЬ: Использование LockBits для просмотра каждого пикселя:
Bitmap b = new Bitmap( "some path" );
BitmapData data = b.LockBits( new Rectangle( 0, 0, b.Width, b.Height ),
ImageLockMode.ReadOnly, b.PixelFormat ); // make sure you check the pixel format as you will be looking directly at memory
unsafe
{
// example assumes 24bpp image. You need to verify your pixel depth
// loop by row for better data locality
for( int y = 0; y < data.Height; ++y )
{
byte* pRow = (byte*)data.Scan0 + y * data.Stride;
for( int x = 0; x < data.Width; ++x )
{
// windows stores images in BGR pixel order
byte r = pRow[2];
byte g = pRow[1];
byte b = pRow[0];
// next pixel in the row
pRow += 3;
}
}
}
b.UnlockBits(data);
Если ваши изображения дополняются в конце, вы можете использовать свойство BitmapData.Stride, чтобы перейти к началу каждой новой строки (в противном случае вы будете читать какой-то мусор и ваши смещения будут шуметь).