QImage перевернуло вертикально

Привет, ребята, у меня есть map_server, который читает файл PGM, но распечатывает перевернутое изображение на QImage. Вот мой код

  int width = msg->info.width;
  int height = msg->info.height;
  const std::vector<int8_t>& data (msg->data);
  unsigned char *p, *q;

  if( mapImage == NULL ) {
      lineImage = new unsigned char[ width * 3 ];
      mapImage = new QImage( width, height, QImage::Format_RGB888 );
  }

  if( mapImage != NULL ) {
      for( int i = 0; i < height; i++ ) {
          q = lineImage;
          p = ( unsigned char * )&data[ i * width ];
          for( int j = 0; j < width; j++ ) {
             *q++ = *p;
             *q++ = *p;
             *q++ = *p;
             p++;
          }
          memcpy( mapImage->scanLine( i ), lineImage, width * 3 );
      }
   }

printf( "Map received!\n" );

"Цикл for" для высоты принимает значение от "0" до предела (высоты), и я могу предположить, что изображение, которое он читает в пределе, до "0".

Я не могу предоставить изображения из-за репутации. Но я все еще надеюсь, что смогу получить некоторую помощь в этом...

Спасибо!

JeremyEthanKoh.

1 ответ

Решение

При преобразовании между JPG и BMP строки сканирования инвертируются в Y. Это относится к формату BMP. Кажется, что ваш QImage представляет собой растровое изображение RGB 24-bil, и вы напрямую пишете в его пиксельной карте построчно. Просто переверните строки развертки по Y:

if( mapImage != NULL ) {
  for( int i = 0; i < height; i++ ) {
      q = lineImage;
      p = ( unsigned char * )&data[ i * width ];
      for( int j = 0; j < width; j++ ) {
         *q++ = *p;
         *q++ = *p;
         *q++ = *p;
         p++;
      }
      memcpy( mapImage->scanLine( height-i-1 ), lineImage, width * 3 );
  }
}
Другие вопросы по тегам