Frage

Ich bin gerade dabei, eine Steganographie-Anwendung mit Qt zu schreiben. Ich versuche, meine Meldebits in dem niedrigstwertigen Bit der blauen Farbe des Pixels zu verbergen.

Von Debuggen kann ich sagen, dass dieser Abschnitt so funktioniert, wie es sollte. Ich speichern Sie dann das Bild jedoch nach meinen Bits in der Nachricht versteckt und es dann wieder öffnen. Dies ist, wo das Problem entwickelt.

Als ich in der (wieder geöffnet) Bild lesen Sie die scanLines, die ich in gelesen sind nicht die gleichen wie die, die ich zuvor geschrieben habe, und ich kann nicht herausfinden, warum. Vielleicht nur es ist mir dumm, oder vielleicht bin ich etwas fehlt. Jede Hilfe wäre sehr geschätzt.

Der Code, den ich bisher habe, ist wie folgt

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;
}

Danke

War es hilfreich?

Lösung

Vergewissern Sie sich, Speichern nicht ein verlustbehaftetes Format wie JPEG verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top