2009-05-13 8 views
3

Ich bin gerade dabei, eine Steganographie-Anwendung mit Qt zu schreiben. Ich versuche, meine Nachrichtenbits in dem am wenigsten signifikanten Bit der blauen Farbe des Pixels zu verstecken.Qt QBeispielpixel-Manipulationsprobleme

Aus dem Debuggen kann ich sagen, dass dieser Abschnitt funktioniert wie es sollte. Aber nachdem ich meine Bits in der Nachricht versteckt habe, speichere ich das Bild und öffne es dann erneut. Hier entwickelt sich das Problem.

Wenn ich das (wiedereröffnete) Bild einlese, sind die scanLines, die ich einlese, nicht die selben wie die, die ich vorher geschrieben habe, und ich kann nicht herausfinden, warum. Vielleicht bin ich nur dumm, oder vielleicht vermisse ich etwas. Jede Hilfe würde sehr geschätzt werden.

Der Code, den ich so weit haben, wie

Sie ein verlustbehaftetes Format, wie zum Beispiel JPEG sind nicht Spar
void MainWindow::Encrypt(QImage image, QString message) { 
    if(image.isNull()) { 
     qDebug() << "PROBLEM"; 
    } 

    image = image.convertToFormat(QImage::Format_ARGB32); 

    QVector<bool> bvec; 
    QByteArray bytes = message.toAscii(); 
    char mask; 
    QRgb tempPix; 

    for(int i = 0; i < bytes.size(); i++) { 
     for(int j = 0; j < 8; j++) { 
      mask = (0x01 << j); 
      bvec.push_back((bytes[i] & mask) == mask); 
     } 
    } 

    if(image.height() < bvec.size()) { 
     qDebug() << "Not enough space in image"; 
    } 

    for(int j = 0; j < bvec.size(); j++) { 
     QRgb *pixel = (QRgb *)image.scanLine(j); 
     tempPix = *pixel; 
     int blue = qBlue(tempPix); 

     blue &= 0xFE; 
     blue |= (bvec[j] == 1) ? 0x01 : 0x00; 
     *pixel = qRgba(qRed(tempPix), qGreen(tempPix), blue, qAlpha(tempPix)); 
    } 

    if(image.save(filename) != true) { 
     emit addToStatusLog("Did not save. Error"); 
    } 
} 

void MainWindow::Decrypt(QImage image) { 
    char temp = 0x00; 
    qint8 mask = 0x01; 
    QVector<bool> bvec; 
    QRgb *pixel; 
    int blue; 

    image = image.convertToFormat(QImage::Format_ARGB32); 

    for(int i = 0; i < image.height(); i++) { 
     pixel = (QRgb *)image.scanLine(i); 
     blue = qBlue(*pixel); 
     bvec.push_back((blue & mask) == mask); 
    } 

    for(int j = 0; j < bvec.size(); j++) { 
     if(j % 8 == 0 && j != 0) { 
      qDebug() << temp; 
      temp = 0x00; 
     } 
     temp |= (bvec[j]) ? (0x01 << (j%8)) : 0x00; 
    } 

    qDebug() << temp; 
} 

Dank

+1

Verwenden Sie kein verlustbehaftetes Komprimierungsformat? –

Antwort

9

Stellen Sie sicher, folgt.

+0

Vielen Dank, speichern Sie es als PNG behebt das Problem. =] – mdec