Отображение изображения, 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;
}
Re: Отображение изображения, Qt5.6.2
От: SaZ  
Дата: 25.06.20 15:03
Оценка: 3 (1)
Здравствуйте, milkpot, Вы писали:

M>Здравствуйте,

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

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

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

M>


Вручную создавать маленький QImage пробовали? Альфа канал правильно указан? Порядок байт правильный?
Очень уж трудно быть телепатом для вашей отладки
Re[2]: Отображение изображения, Qt5.6.2
От: milkpot Россия  
Дата: 25.06.20 16:35
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, milkpot, Вы писали:


SaZ>Вручную создавать маленький QImage пробовали? Альфа канал правильно указан? Порядок байт правильный?

SaZ>Очень уж трудно быть телепатом для вашей отладки

Пробовал создать png файл, получается файл черного цвета размером 339 байт.
Пример:
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*/);
       // const uint rgb_value=0xFF000000 /*0*/;
        QRgb q_rgb;
        int bytesperLine=0;
        int bytecount=0;
        QRgb *pixels;

        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); //QRgb
        for(int i=0;i<81920;i++) {
            ch_array[i]=Convert(buffer_vect.at(i)/*sh_buffer._16bitBuffer[i]*/);
        }
        //----------------
        pixels=reinterpret_cast<QRgb*>(loc_img.bits());
        for(int i=0;i<rct_size.width()*rct_size.height();i++)
        {
            pixels[i]=qRgb(ch_array[i],ch_array[i],ch_array[i]);
        }
        //----------------
       // 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);
        loc_img.save("file.png","PNG");
        graphicspixmapItem=scene->addPixmap(pixmap_copy);
        file.close();
        ;
        return;
}
Re[3]: Отображение изображения, Qt5.6.2
От: SaZ  
Дата: 25.06.20 17:36
Оценка: 3 (1)
Здравствуйте, milkpot, Вы писали:

M>...


Ладно, извините, у меня сейчас нет возможности писать с нуля примеры. Советую вам попробовать сделать это самому. В таком случае любой желающий вам помочь сможет этот код запустить у себя с минимальными телодвижениями.

Попробуйте убрать из вашего кода всё, что не связано непосредственно с QImage. Псевдокод:
main()
{
  const char pixels[4] = {128,128,128,128,};
  auto image = QImage::fromxxx( pixels );
  image.save("test.png");
}


Так же не используйте никакие reinterpret_cast и c-style cast. Обычно тут можно словить косяки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.