Jeśli chodzi o piksele, to zamiast GetPixel i SetPixel użyj LockBits i operacje na tablicy, będzie znacznie szybciej. Bitmapę należy postrzegać jako tablice pikseli rysowanych linia po linii.
Poniżej kawałki kodu z moich hobbystycznych projektów. To są tylko przykłady, które mają naprowadzić na właściwą drogę, czego szukać, a nie gotowce. Jest możliwe, że nie będzie się kompilować lub będzie czegoś brakować, ale powinno być zrozumiałe, co jest potrzebne, i jak działa.
Skopiowanie tablicy do bitmapy "jak leci":
byte[] Data = new Data[640*480*3];
Bitmap Bmp = new Bitmap(640, 480, PixelFormat.Format24bppRgb);
BitmapData Bmp_ = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
System.Runtime.InteropServices.Marshal.Copy(Data, 0, Bmp_.Scan0, 640 * 480 * 3);
ToBitmapBmp.UnlockBits(Bmp_);
Operacja na pikselach (musi być włączone pozwolenie na unsafe w opcjach kompilacji), przepisanie piksel po pikselu z tablicy bajtów dowolnej długości do bitmapy (zakodowanie bajtów w kolorach):
byte[] Raw = new byte[10000];
Bitmap ImgBitmap = new Bitmap(640, 480, PixelFormat.Format24bppRgb);
int ImgW = ImgBitmap.Width;
int ImgH = ImgBitmap.Height;
GraphicsUnit GUP = GraphicsUnit.Pixel;
BitmapData ImgBitmap_ = ImgBitmap.LockBits(Rectangle.Round(ImgBitmap.GetBounds(ref GUP)), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
int RawPointer = 0;
byte* ImgPointer = (byte*)ImgBitmap_.Scan0;
// Create image iterated by rows and columns without the last, not full-width row
for (int Y = 0; Y < (ImgH - 1); Y++)
{
for (int X = 0; X < ImgW; X++)
{
ImgPointer[0] = Raw[RawPointer + 0];
ImgPointer[1] = Raw[RawPointer + 1];
ImgPointer[2] = Raw[RawPointer + 2];
RawPointer += 3;
ImgPointer += 3;
}
ImgPointer += ImgBitmap_.Stride - (3 * ImgW);
}
// Put the last bytes in the last row, which may be not as length as image width
while (RawPointer < Raw_Length)
{
ImgPointer[0] = Raw[RawPointer];
RawPointer++;
ImgPointer++;
}
}
ImgBitmap.UnlockBits(ImgBitmap_);
Akurat wstawiłem kawałki kodu, które malują bitmapę na podstawie tablicy, ale działanie odwrotne, czyli odczyt pikseli, jest bardzo podobne, tylko teraz nie mam "na wierzchu" czegoś, co mogę wkleić jako przykład.