2015-09-23 1 views
0

Je tente de reconstruire une image à partir d'un fichier au format hexadécimal 386. Après l'analyse du fichier, toutes les données que je copie dans un QByteArray et le même tableau sont utilisés pour créer un objet QImage. Mais quelle que soit l'image que j'ai obtenue après la reconstruction n'est pas parfaite. J'obtiens la couleur bleue au lieu du noir, les bords ne sont pas clairs etc. Le dossier de texte que j'analyse est un vidage de mémoire de RAM du contrôleur de STM32F4 (bras). L'image est stockée dans le format RGB565.Impossible de reconstruire l'image RGB565 à partir de données brutes à l'aide de QImage

code pour créer l'image:

{ 
    QString strFilename; 
    Hex386Parser oFileParser; 
    strFilename = QFileDialog::getOpenFileName(this,"Select a file", QDir::homePath()); 
    oFileParser.parseFile(strFilename, oByteArray); 
    QImage image(320, 240, QImage::Format_RGB16); 

    for (int y = 0; y < image.height(); y++) 
    { 
     memcpy(image.scanLine(y), oByteArray.constData() + y * image.bytesPerLine(), 
      image.bytesPerLine()); 
    } 

    qDebug() <<"Size of the byte array is " <<oByteArray.size(); 
    QLabel *label = new QLabel(); 
    label->setPixmap(QPixmap::fromImage(image)); 
    label->show(); 
} 

code à utiliser pour analyser le fichier:

#define QT_NO_CAST_TO_ASCII 
void Hex386Parser::parseFile(QString strFilename,QByteArray& ref_ByteArray) 
{ 
    QFile oFile(strFilename); 
    std::stringstream sstr; 
    QString strLength; 

    int unLength = 0, unAddress = 0,unDescriptor =0xFFFF,nIndex =0,nlineno=0; 
    if (oFile.open((QIODevice::ReadOnly | QIODevice::Text))) 
    { 
     QTextStream in(&oFile); 
     while (!in.atEnd()) 
     { 
      QString line = in.readLine(); 
      nIndex = 0; 
      nlineno++; 
      //unsigned char *pCharFrame = (unsigned char *)line.toStdString().c_str(); 
      if (':' != line.at(nIndex)) 
      { 
       // file corrupted 
       return; 
      } 
      nIndex++; 

      { 
       strLength = line.mid(nIndex, 2); 
       sstr << strLength.toStdString(); 
       sstr << std::hex; 
       sstr >> unLength; // get length of the record 
       strLength.clear(); 
       sstr.clear(); 
      } 

      nIndex += 2; 
      unAddress = line.mid(nIndex,4).toInt(); // get address bytes 
      nIndex +=4; 
      unDescriptor = line.mid(nIndex, 2).toInt(); // get data descriptor 
      nIndex += 2; 
      switch(unDescriptor) 
      { 
      case data_record: 
       ref_ByteArray.append((line.mid(nIndex, unLength))); 
       // add data to bytearray 
       break; 
      case end_of_file_record: 
       break; 
      case extended_segment_address_record: 
       break; 
      case extended_linear_address_record: 
       break; 
      case start_linear_address_record: 
       break; 
      } 
     } 
     oFile.close(); 
    } 
} 

Qu'est-ce que je fais mal ??

Répondre

0

Le line contient des représentations de chaînes hexadécimales dans lesquelles chaque octet est codé sur deux caractères.

Vous souhaitez des octets binaires. Donc, les symboles 2 * unLength doivent être lus à partir de line. Ensuite, cette chaîne de données doit être convertie en binaire, par exemple:

{ 
case data_record: 
    QByteArray hex = line.mid(nIndex, 2 * unLength).toLatin1(); 
    QByteArray binary = QByteArray::fromHex(hex); 
    ref_ByteArray.append(binary); 
... 
}