Отображение изображения, Qt5.6.2
От: milkpot Россия  
Дата: 23.06.20 13:29
Оценка:
Здравствуйте,
стоит задача отобразить полученные от устройства данные в виде изображения.
Из устройства приходят данные размером 320х256 16-разрядных слов, содержащие изображение.
Устройство с тестовом режиме генерирует изображения, которые сохраняются в файл.
В примере ниже полученные данные программа получает из файла. В файле из двух байт каждого пиксела один байт
нулевой.
Отображается изображение как 32-разрядное в формате QImage::Format_RGB32. Получается в результате черный
прямоугольник вместо изображения.
Пример:
static unsigned char ch_array[81920];
static unsigned int u32_ch_array[81920];

unsigned char Convert(const unsigned short int v)
{
    return v >> 8;
}
void MainWindow::on_pushButton_6_clicked()
{
        QString str;
       // str.append(" --- slot button6Clicked() ");
       // appendtoLogListBox(str);
        QString filePath;
        QFile file;
        QDataStream dstrm;
        int data_quant=0;
        std::vector<unsigned short> buffer_vect;
        QImage loc_img(rct_size,QImage::Format_RGB32 /*QImage::Format_RGBX8888*/);// rct_size = 320 width, and 256 height
        const uint rgb_value=0xFF000000 /*0*/;
        QRgb q_rgb;

        QBuffer hr;
        QFileDialog filedialog;
        filePath=QFileDialog::getOpenFileName(this,tr("Opening the data file"),tr(""),tr("Binary files (*.bin )"));
        if(false==filePath.isEmpty())
        {
            //str.append(" *** ОШИБКА: исходный файл типа pixmap не создан");
            appendtoLogListBox(filePath);
        }
        file.setFileName(filePath);
        if(false==file.open(QIODevice::ReadOnly))
        {
            str.append(" *** ОШИБКА: не удалось открыть выбранный файл");
            appendtoLogListBox(str);
            return;
        }
        dstrm.setDevice(&file);
        fileSize=file.size();
        str=QString(tr("  --- fileSize= %1")).arg(fileSize);
        appendtoLogListBox(str);
        buffer_vect.resize(fileSize/2);
        data_quant=dstrm.readRawData((char *)&buffer_vect[0],fileSize);
        str=QString(tr(" --- readRawData returned = %1")).arg(data_quant);
        appendtoLogListBox(str);
        for(int i=0;i<81920;i++) {
            ch_array[i]=Convert(buffer_vect.at(i)/*sh_buffer._16bitBuffer[i]*/);
        }
        for(int i=0;i<81920;i++) {
            u32_ch_array[i]=rgb_value | ch_array[i] | (ch_array[i] << 8) | (ch_array[i] << 16);
        }
        for(int i=0;i<rct_size.width();i++)
            for(int j=0;j<rct_size.height();j++)
            {
                loc_img.setPixel(i,j,u32_ch_array[i*rct_size.width()+j]);
            }
      // pixmap_copy=QPixmap::fromImage( loc_img);
         pixmap_copy=QPixmap::fromImage( QImage( (unsigned char *)& (/*buffer_vect[0]*/ /*ch_array[0]*/ u32_ch_array[0] /*sh_buffer._8bitBuffer[0]*/ ) ,rct_size.width() /*image_width*/,rct_size.height() /*image_height*/, QImage::Format_RGB32  /*QImage::Format_RGB16*/ /*QImage::Format_RGBX8888*/)  );
        graphicspixmapItem=scene->addPixmap(pixmap_copy);
       
        file.close();
        ;
        return;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.