перевернутое изображение в C # - PullRequest
0 голосов
/ 24 февраля 2011

Это мой кусок кода, который я собрал с здесь .

private unsafe byte[] BmpToBytes_Unsafe(Bitmap bmp)

        {

            BitmapData bData = bmp.LockBits(new Rectangle(0,0,1000,1000),

                ImageLockMode.ReadOnly,

                PixelFormat.Format24bppRgb);

            // number of bytes in the bitmap



            int byteCount = bData.Stride * bmp.Height;

            byte[] bmpBytes = new byte[byteCount];



            // Copy the locked bytes from memory





           Marshal.Copy(bData.Scan0, bmpBytes, 0, byteCount);

            Marshal.



            // don't forget to unlock the bitmap!!

            bmp.UnlockBits(bData);



            return bmpBytes;

        }

У меня есть функция, которая получает байт из вышеупомянутой функции и просто отображает ее без дальнейшей обработки. Но я получаю перевернутое изображение на выходе. Может кто-нибудь объяснить?

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Когда вы говорите «перевернутый», я предполагаю, что вы имеете в виду вверх ногами?

Вы не можете полагаться на «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;
}
1 голос
/ 24 февраля 2011

Это нормально, растровые изображения хранятся в обратном порядке. Нижняя линия сканирования находится в BitmapData.Scan0. Вам нужно будет исправить это, возможно, копируя одну строку сканирования за раз. Зависит от того, как вы его отображаете.

0 голосов
/ 24 февраля 2011

24 бит / бит оконных карт Windows внутренне сохраняет цвета пикселей в порядке BGR, а не RGB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...