Bez względu na format obrazu, SetPixel()
jest brutalnie wolny. Nigdy nie używam go w praktyce.
Możesz ustawić piksele o wiele szybciej za pomocą metody LockBits, która pozwala szybko zarządzać danymi zarządzanymi do niezarządzanych bitmap bitowych.
Oto przykład jak to może wyglądać:
Bitmap bitmap = // ...
// Lock the unmanaged bits for efficient writing.
var data = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);
// Bulk copy pixel data from a byte array:
Marshal.Copy(byteArray, 0, data.Scan0, byteArray.Length);
// Or, for one pixel at a time:
Marshal.WriteInt16(data.Scan0, offsetInBytes, shortValue);
// When finished, unlock the unmanaged bits
bitmap.UnlockBits(data);
Należy zauważyć, że 16-bitowego w odcieniach szarości wydaje się być obsługiwany przez GDI +, co oznacza, że .NET nie pomaga się z 16-bitowego zapisywania bitmapy w skali szarości w pliku lub strumień. Zobacz http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab
Dzięki. Początkowo używałem SetPixel, ponieważ piszę tylko mapę bitową 512x512 do systemu plików (tworząc mapę wysokości bryły utworzoną przez obrót rozkładu Gaussa wokół osi pionowej do wykorzystania w innym programie). Dobrze, że SetPixel jest zbyt wolny dla większości aplikacji. Ostatecznie zdecydowałem się na inny format mapy wysokości z powodu ograniczeń, które wskazałeś, ale twoja odpowiedź jest poprawna i kompletna, więc akceptujesz. –