Simple overlay render logic(need memory manage logic).

This commit is contained in:
Krad
2022-09-15 11:05:09 +08:00
parent 258b56b456
commit ceca43ceca
6 changed files with 45 additions and 1 deletions

View File

@@ -30,6 +30,15 @@ public:
{
return m_image;
};
//image data
vtkImageData* GetOverlayData()
{
return m_OverlayImage;
};
void SetOverlayData(vtkImageData* img)
{
m_OverlayImage = img;
};
//Image Properties
ExtendMedicalImageProperties* GetProperty()
{
@@ -39,6 +48,7 @@ public:
bool IntersectWorldBounds(SeriesImageSet* imageSet);
private:
vtkSmartPointer <vtkImageData> m_image;
vtkSmartPointer <vtkImageData> m_OverlayImage;
ExtendMedicalImageProperties* m_property = nullptr;
std::string m_pUniqueID;
};

View File

@@ -136,6 +136,9 @@ SeriesImageSet* DicomLoader::getSeriesImageSet(const std::string& uniqueID)//, D
reader->Update();
auto imageData = reader->GetOutput();
SeriesImageSet* result = new SeriesImageSet((*iter),imageData);
if (reader->GetHasOverlay()){
result->SetOverlayData(reader->GetOutputOverLayData());
}
// imageData->Register(placeHolder);
reader->Delete();
reader = nullptr;

View File

@@ -30,8 +30,10 @@ QPixmap DicomUtil::GetThumbnail(ExtendMedicalImageProperties *property) {
//将原始传输语法输入DicomImage编译类库自我解压压缩的图像
DicomImage dcmImage(fileFormat, dset->getOriginalXfer(), CIF_MayDetachPixelData);
unsigned long w = 100;
bool flag = dcmImage.getWidth() > dcmImage.getHeight();
DicomImage *sdcmImage = dcmImage.createScaledImage(w, 0, 0, 1);
sdcmImage->setWindow(wl, ww);
if (sample == 1) {
uchar *data = (uchar *) sdcmImage->getOutputData(8);//按8位的位宽取数据

View File

@@ -254,6 +254,29 @@ void DICOMImageViewer::SetInputConnection(vtkAlgorithmOutput *input) {
this->RemoveFusionData();
}
void DICOMImageViewer::SetOverlayInputData(vtkImageData *in) {
auto OverlayMapper = vtkImageSliceMapper::New();
OverlayMapper->SliceAtFocalPointOn();
OverlayMapper->SliceFacesCameraOn();
OverlayMapper->SetInputData(in);
auto OverlayActor = vtkImageSlice::New();
vtkNew<vtkLookupTable> table;
table->SetNumberOfTableValues(1);
table->SetRange(245.5,255.5);
table->SetAboveRangeColor(.0, .0, .0, .0);
table->SetBelowRangeColor(.0, .0, .0, .0);
table->SetUseAboveRangeColor(1);
table->SetUseBelowRangeColor(1);
table->SetTableValue(0,0.8,0.8,0.5);
table->Build();
OverlayActor->SetMapper(OverlayMapper);
OverlayActor->GetProperty()->SetLayerNumber(2);
OverlayActor->GetProperty()->SetLookupTable(table);
OverlayActor->GetProperty()->SetUseLookupTableScalarRange(1);
this->ImageStack->AddImage(OverlayActor);
}
vtkTypeBool DICOMImageViewer::GetOffScreenRendering() {
return this->RenderWindow->GetOffScreenRendering();
}
@@ -1223,6 +1246,7 @@ void DICOMImageViewer::SetReconPlane(int plane) {
SetSlice(0);
}
int DICOMImageViewer::GetReconPlane() {
if (SlicePlane>=0) return SlicePlane;
double projVector[4] = {.0, .0, .0, 1.0};
@@ -1233,7 +1257,6 @@ int DICOMImageViewer::GetReconPlane() {
return ::projToPlane(ret);
}
void DICOMImageViewer::UpdateReconPlane() {
// Set the camera position
vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : nullptr;

View File

@@ -105,6 +105,8 @@ public:
//@}
void SetOverlayInputData(vtkImageData *in);
/**
* Set/get the slice orientation
*/

View File

@@ -155,6 +155,10 @@ void DicomImageView::loadSeries(SeriesImageSet *series) {
.arg(time)
.arg(series->GetProperty()->GetSeriesDescription()));
mImageViewer->SetInputData(mSeries->GetData());
if(mSeries->GetOverlayData())
{
mImageViewer->SetOverlayInputData(mSeries->GetOverlayData());
}
mImageViewer->SetCoordsTransformMatrix(series->GetProperty());
mImageViewer->InitCornerInfo(series->GetProperty());
mImageViewer->SetupImageViewer();