سؤال

وأنا حاليا في عملية كتابة تطبيق إخفاء المعلومات مع كيو تي. أحاول إخفاء بلدي بت رسالة في أقل قليلا كبير من اللون الأزرق من بكسل.

ومن التصحيح استطيع ان اقول ان هذا القسم يعمل كما يجب. ولكن بعد يختبئ بت بلدي في رسالة I ثم حفظ الصورة ثم إعادة فتحه. هذا هو المكان الذي تطور المشكلة.

وعندما قرأت في (فتح) صورة scanLines التي قرأتها في ليست هي نفس تلك التي كتبت في السابق، وأنا لا يمكن معرفة السبب. ربما انها مجرد لي يجري غبي، أو ربما أنا شيء مفقود. أي مساعدة سيكون محل تقدير كبير.

ورمز لدي حتى الآن على النحو التالي

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

والشكر

هل كانت مفيدة؟

المحلول

تأكد من أنك لا تقوم بحفظ باستخدام تنسيق الضياع، مثل JPEG.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top