2015-06-29 3 views
0

Я пытаюсь создать QImage из std :: vector. Я пытался;Convert std :: vector <uint8_t> to QImage

void FaceCutThread::convertImage(std::vector<uint8_t> &buf) 
{ 
    QImage img(&buf[0], 300, 300, QImage::Format_ARGB32); 

    emit isFinisedFaceCut(img); 
} 

и

void FaceCutThread::convertImage(std::vector<uint8_t> &buf) 
{ 
    QImage img(buf.data(), 300, 300, QImage::Format_ARGB32); 

    emit isFinisedFaceCut(img); 
} 

как два типа конвертации не дает какой-либо ошибки, однако, когда я попытался показать это в QLabel как;

void MainWindow::handleFaceResults(QImage& buf) 
{ 
    QImage myImage(buf); 
    ui->lblRawImage->setPixmap(QPixmap::fromImage(myImage)); 
} 

мое приложение всегда неожиданно отделка. Не могли бы вы помочь мне как правильно преобразовать в QImage?

EDIT:

Я могу написать изображение в файл без каких-либо проблем, как;

bool save_file (const string &path, const vector<uint8_t> &data) 
{ 
    std::ofstream os; 
    os.open(path.c_str(), std::ios::out | std::ios::binary); 
    if (!os.is_open()) 
     return false; 

    os.write((const char*)data.data(), data.size()); 
    return true; 
} 
+0

Вы уверены, что buf содержит достаточно элементов (300 * 300 * 4)? – marom

+0

@marom, на самом деле я не знаю высоту и ширину buf ... Но я знаю его размер. Пожалуйста, см. Мои последние изменения .. – goGud

+0

Хорошо, я переформулирую свой вопрос: достаточно ли data.size (buf.size()) достаточно большой? Должно быть (не менее) 300 * 300 * 4. – marom

ответ

1

я решил аналогичную проблему с QImageReader и QBuffer

QByteArray data = QByteArray::fromRawData(reinterpret_cast<const char*>(buf.data()), buf.size()); 
QBuffer buffer(data); 
QImageReader reader(&buffer); 
QImage img = reader.read(); 
+0

хорошо для вас, однако лучше дать идею или ваш подход, чтобы понять более четко. – goGud

+0

отредактировал мой ответ. Однако Qt docs имеет примеры кода ... – Miki

+0

Проблема заключается в том, что буфер должен иметь какой-то формат портативного изображения, например PNG или JPEG и т. Д. Если буфер содержит необработанные данные, это неправильный подход. –

1

Вы должны убедиться, что у std::vector<uint8_t> &buf достаточно данных. Для QImage :: Format_ARGB32 я ожидал бы, что на выборку потребуется 4 байта, поэтому buf.size() должен быть не менее 300 * 300 * 4.

Что поделать это меньше? Ну, в этом случае, возможно, размер изображения не 300x300, и вам нужно выяснить, как это обнаружить. Или вы можете заполнить BUF с «0», чтобы получить нужный размер только проверить, что в этом случае все работает (или, лучше сказать, ничего плохого не происходит)

+0

Я меняю ширину и высоту на 50 пикселей. поэтому в вашем примере мне нужно 10000 buf. Где выбор изображения имеет размер 367974 buf ... Но его снова неожиданно закончил – goGud

+0

Еще одна вещь, которую я nortice заключается в том, что вы излучаете сигнал и обрабатываете объект по ссылке (QImage & buf), когда оригинал оригинала вышел из области видимости. Что делать, если вы попытаетесь передать QImage указателем? – marom

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