Здравствуйте,
стоит задача отобразить полученные от устройства данные в виде изображения.
Из устройства приходят данные размером 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;
}