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