Question

Je suis en train d'écrire une application stéganographie avec Qt. Je suis en train de cacher mes bits de message dans le bit le moins significatif de la couleur bleue du pixel.

De débogage, je peux dire que cette section fonctionne comme il se doit. Cependant après avoir caché mes bits dans le message que je puis enregistrez l'image, puis ouvrir à nouveau. C'est là que le problème se développe.

Quand je lis dans la (réouverture) l'image que je le lis scanLines dans ne sont pas les mêmes que ceux que j'ai déjà écrit, et je ne peux pas comprendre pourquoi. Peut-être juste moi d'être stupide, ou peut-être me manque quelque chose. Toute aide serait très apprécié.

Le code que j'ai jusqu'à présent est la suivante

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

Merci

Était-ce utile?

La solution

Assurez-vous de ne pas économiser en utilisant un format lossy, tels que JPEG.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top