Когда вы говорите «перевернутый», я предполагаю, что вы имеете в виду вверх ногами?
Вы не можете полагаться на «l33t hax0r skillz» человека, размещающего этот код.Ему не хватает жизненно важной информации о том, как растровые изображения обрабатываются в памяти.
Когда вы читаете данные из растрового изображения, вы не можете прочитать их все одним куском.Данные хранятся в строках, и строки могут храниться либо в верхней строке, либо в нижней строке.Кроме того, между строками может быть заполнение, чтобы каждая строка находилась на границе четного слова.
Свойство Scan0
является указателем на начало первой строки, а свойство Stride
является смещениемк началу следующей строки.Свойство Width
можно использовать для определения количества данных в каждой строке.
Итак, вам необходимо копировать данные по одной строке за раз:
int lineSize = bData.Width * 3;
int byteCount = lineSize * bData.Height;
byte[] bmpBytes = new byte[byteCount];
IntPtr scan = bData.Scan0;
for (int i = 0; i < bData.Height; i++) {
Marshal.Copy(scan, bmpBytes[i * lineSize], 0, lineSize);
scan += bData.Stride;
}