Pregunta

Actualmente estoy en el proceso de escribir una aplicación de esteganografía con Qt. Estoy tratando de ocultar mis bits de mensaje en el bit menos significativo del color azul del píxel.

A partir de la depuración Puedo decir que esta sección está funcionando como debiera. Sin embargo después de ocultar mis bits en el mensaje que a continuación, guardar la imagen y vuelva a abrirlo. Aquí es donde se desarrolla el problema.

Cuando leí en la imagen (reapertura) del scanLines que leí en no son los mismos que los que he escrito anteriormente, y no puedo entender por qué. Tal vez sea sólo yo ser estúpido, o tal vez me falta algo. Cualquier ayuda sería muy apreciada.

El código que tengo hasta ahora es la siguiente

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

Gracias

¿Fue útil?

Solución

Asegúrese de que no está ahorrando el uso de un formato con pérdida, como JPEG.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top