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".

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

Спасибо!

Джереми Итан Кох.


person hotandkoh    schedule 07.08.2014    source источник
comment
Я допускаю угадывание здесь, но если бы система координат экрана использовалась только в одном изображении, это могло бы вызвать это.   -  person user2672165    schedule 07.08.2014
comment
@ user2672165 Что ты имеешь в виду? Но в любом случае это отдельная вещь, не так ли..? Затем он считывает пиксели за пикселями, распечатывая пиксели за пикселями, и единственная проблема заключается в том, что начальный первый пиксель отличается. О, чувак, я даже сам не знаю.   -  person hotandkoh    schedule 07.08.2014
comment
Взгляните на этот stackoverflow.com/questions /8346115/   -  person user2672165    schedule 07.08.2014


Ответы (1)


При преобразовании между JPG и BMP строки сканирования инвертируются по оси Y. Это характерно для формата BMP. Кажется, что ваш QImage представляет собой 24-битное растровое изображение RGB, и вы напрямую пишете его пиксельную карту построчно. Просто поменяйте местами строки сканирования в 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 );
  }
}
person Baj Mile    schedule 07.08.2014
comment
о боже ВАУ. Спасибо чувак! Вы спасли мою жизнь. Но не могли бы вы сделать мне одолжение, объяснив, почему это ( height-i-1 )? :) @Baj Миля - person hotandkoh; 08.08.2014