(与Qt相关的问题)vtkImageData如何转化为QByteArray?
vtk吧
全部回复
仅看楼主
level 6
7号撞针 楼主
是这样的,我需要把VTK窗口渲染出来的图像发送到Web。已经验证了这条路是可行的:
vtkWindowToImageFilter windowToImageFilter = vtkWindowToImageFilter::New();
windowToImageFilter->SetInput(renWin);
windowToImageFilter->Modified();
windowToImageFilter->Update();
vtkPNGWriter pngWriter = vtkPNGWriter::New();
pngWriter->SetFileName("screenshot2.png");
pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort());
pngWriter->Write();
这两步就能把VTK窗口的图像抠下来并保存成 .png图像了。
接下来对于Qt:
QString filename = QString("screenshot2.png");
QImageReader *imgReader;
imgReader->setFileName(filename);
QImage *image;
*image = imgReader->read();
QByteArray byteArray;
QBuffer buffer(&byteArray);
image->save(&buffer,"PNG");
QByteArray hexed = byteArray.toBase64();
这样就得到了base64加密的QByteArray hexed,hexed可以发送到Web并基于HTML5直接显示
这样确实可以达到效果,但是中间经过了把VTK窗口图像保存成 .png格式,再读取 .png图像为ByteArray的过程,显得超级蠢。
我是这样想的,既然能保存成.png,那在这一步之前肯定已经有二进制的数据存在(十有八九是vtkUnsignedCharArray),那我直接把这个数据转化成QByteArray不就省了一大步吗?这中间肯定是能转化,但我想知道VTK或者QT有没有提供这样的接口?
问题可能比较冷门,遇到过这个问题或者有任何建议的同学请不吝赐教,感激不尽。
2016年01月12日 04点01分 1
level 6
7号撞针 楼主
目前用的是一个 vtkImageData 转 QImage 的方法,还是中间多转了一步 QImage ...(QImage 转 QByteArray 也是个麻烦事儿..)问题是vtkUnsignedCharArray 转 QByteArray 有没有更直接的方法呢?
2016年04月14日 02点04分 3
[真棒]不懂强行点赞
2016年04月14日 02点04分
@你不是真的痛苦 我应该是有什么地方蠢了一下。。毕竟这事儿看起来还蛮简单
2016年04月14日 11点04分
跪求 vtkImageData 转 QImage 的方法[乖]
2016年08月31日 07点08分
@咕哒咸鱼王 贴在底楼了
2016年09月01日 02点09分
level 12
这个必须可以有[哈哈]
2016年09月01日 00点09分 4
level 12
这里贴个vtkImage转QImage的思路,其实就是对应像素点赋值。
2016年09月01日 05点09分 6
level 12
1、获得各种vtkImageData的信息
int tmp_extent[6] = {0};
vtkImageData* temp_data = *_2diter;
temp_data->GetExtent(tmp_extent);
uchar* voxel = static_cast<uchar*>(temp_data->GetScalarPointer());
2016年09月01日 06点09分 7
level 12
2、转换成char类型
vtkSmartPointer<vtkImageCast> castFilter = vtkSmartPointer<vtkImageCast>::New();
castFilter->SetInput(temp_data);
castFilter->SetOutputScalarTypeToUnsignedChar();
castFilter->Update();
2016年09月01日 06点09分 8
level 12
3、每个像素点赋值
QImage m_imagehheee(tmp_extent[1],tmp_extent[3],QImage::Format_RGB888);
for (int x=0;x< tmp_extent[1];x++)
{
for (int y=0;y< tmp_extent[3];y++)
{
unsigned char* hhhh = static_cast<unsigned char*>(castFilter->GetOutput()->GetScalarPointer(x,y,0));
QRgb pixellllll = qRgb(*hh,*hh,*hh);
m_imagehheee.setPixel(x,y,pixel);
}
}
2016年09月01日 06点09分 9
请问下,QRgb pixellllll = qRgb(*hh,*hh,*hh)中的*hh是什么
2018年03月15日 02点03分
吧主大大,我运行代码的时候,发现像素点赋值这一段双重循环有点耗时间,请问下有没有什么解决方法@rabbitbride
2018年03月15日 13点03分
2018年03月15日 13点03分
level 12
4、没了。我负责抛砖,引玉的事情大家来完成。[哈哈]
2016年09月01日 06点09分 10
2016年09月01日 06点09分
level 6
7号撞针 楼主
咦?我昨天没贴上么?怎么看不到代码。。@把把心战三无中
我的代码长下面这样:
QImage createQImage1(int width, int height, vtkUnsignedCharArray* scalars)
{
QImage qImage(width, height, QImage::Format_ARGB32);
vtkIdType tupleIndex = 0;
int qImageBitIndex = 0;
QRgb* qImageBits = (QRgb*)qImage.bits();
unsigned char* scalarTuples = scalars->GetPointer(0);
for (int j = 0; j<height; j++)
{
for (int i = 0; i<width; i++)
{
unsigned char* tuple = scalarTuples + (tupleIndex++);
QRgb color = qRgba(tuple[0], tuple[0], tuple[0], 255);
*(qImageBits + (qImageBitIndex++)) = color;
}
}
return qImage;
}
QImage createQImage2(int width, int height, vtkUnsignedCharArray* scalars)
{
QImage qImage(width, height, QImage::Format_ARGB32);
vtkIdType tupleIndex = 0;
int qImageBitIndex = 0;
QRgb* qImageBits = (QRgb*)qImage.bits();
unsigned char* scalarTuples = scalars->GetPointer(0);
for (int j = 0; j<height; j++)
{
for (int i = 0; i<width; i++)
{
unsigned char* tuple = scalarTuples + (tupleIndex++ * 2);
QRgb color = qRgba(tuple[0], tuple[0], tuple[0], tuple[1]);
*(qImageBits + (qImageBitIndex++)) = color;
}
}
return qImage;
}
QImage createQImage3(int width, int height, vtkUnsignedCharArray* scalars)
{
QImage qImage(width, height, QImage::Format_ARGB32);
vtkIdType tupleIndex = 0;
int qImageBitIndex = 0;
QRgb* qImageBits = (QRgb*)qImage.bits();
unsigned char* scalarTuples = scalars->GetPointer(0);
for (int j = 0; j<height; j++)
{
for (int i = 0; i<width; i++)
{
unsigned char* tuple = scalarTuples + (tupleIndex++ * 3);
QRgb color = qRgba(tuple[0], tuple[1], tuple[2], 255);
*(qImageBits + (qImageBitIndex++)) = color;
}
}
return qImage;
}
QImage createQImage4(int width, int height, vtkUnsignedCharArray* scalars)
{
QImage qImage(width, height, QImage::Format_ARGB32);
vtkIdType tupleIndex = 0;
int qImageBitIndex = 0;
QRgb* qImageBits = (QRgb*)qImage.bits();
unsigned char* scalarTuples = scalars->GetPointer(0);
for (int j = 0; j<height; j++)
{
for (int i = 0; i<width; i++)
{
unsigned char* tuple = scalarTuples + (tupleIndex++ * 4);
QRgb color = qRgba(tuple[0], tuple[1], tuple[2], tuple[3]);
*(qImageBits + (qImageBitIndex++)) = color;
}
}
return qImage;
}
QImage createQImage(vtkImageData* imageData)
{
if (!imageData)
return QImage();
int width = imageData->GetDimensions()[0];
int height = imageData->GetDimensions()[1];
vtkUnsignedCharArray* scalars = vtkUnsignedCharArray::SafeDownCast(imageData->GetPointData()->GetScalars());
if (!width || !height || !scalars)
return QImage();
switch (scalars->GetNumberOfComponents())
{
case 1:
return createQImage1(width, height, scalars);
case 2:
return createQImage2(width, height, scalars);
case 3:
return createQImage3(width, height, scalars);
case 4:
return createQImage4(width, height, scalars);
}
return QImage();
}
2016年09月02日 01点09分 11
应该可以直接用
2016年09月02日 01点09分
@7号撞针 这么长的代码,幸苦了
2016年09月02日 01点09分
@7号撞针 谢谢楼主[哈哈]
2016年09月02日 02点09分
@rabbitbride 反正都是直接粘下来的啦,而且内容基本都是重复的[哈哈]
2016年09月03日 04点09分
1