2009-05-13 3 views
3

В настоящее время я пишу приложение для стеганографии с Qt. Я пытаюсь скрыть свои биты сообщения в младшем значении бит синего цвета пикселя.Проблемы с манипуляцией пикселями Qt QImage

От отладки Я могу сказать, что этот раздел работает так, как должен. Однако после того, как я спрячу свои биты в сообщении, я затем сохраню изображение, а затем снова открою его. Именно здесь развивается проблема.

Когда я читал в (вновь открывшемся) образе, 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; 
} 

Благодарности

+1

Разве вы не используете формат сжатия с потерями? –

ответ

9

Убедитесь, что вы не экономить, используя формат сжатия с потерями, такие как JPEG.

+0

Большое вам спасибо, сохраняя его, поскольку PNG исправляет проблему. знак равно – mdec

Смежные вопросы