Größe einer Pixmap variabel bestimmen
Verfasst: 25. Mai 2009 10:03
Hallo,
ich weiß nicht ob es das alles bringt was ich hier tippe aber ich probier es trotzdem mal, weil ihr glaub ich nicht den ganzen gdcm klassenverband zur hand habt. Naja probieren wirs mal.
Also ich habe folgendes problem. Mein programm soll CT Bilder im Dicom format in eine Pixmap schreiben. Klappt auch schon. Eines kann mein programm jedoch noch nicht und zwar die größe dieser pixmap automatisch bestimmen. Mal 512*512 mal 256*256 je nach gegebendem bild halt.
Ich habe mir mein programm mehr oder weniger aus dem programm was ich ebenfalls poste, wie gesagt ich weiß nicht ob ihr was damit anfangen könnt, HelloVizWorld.cxx zusammengeklaubt. Da kommt auch der Befehl
const unsigned int *dims = image.GetDimensions(); vor.
Und damit habe ich auch mittels breakpoint bisher festgestellt das es mir damit möglich ist die größe des Feldes auf Variablen abzulegen z.b.:
m_iWidth = dims[0];
m_iHeight = dims[1];
so weit so gut jetzt der kern des problems. Da ich mein programm in insgesamt drei klassen unterteilt habe weiß ich nun nicht wie ich es machen kann das ich diese werte aus iWidth und iHeight in die klasse eight_bit_image (name passt nicht mehr so recht programm hat sich etwas größer entwickelt als ich dachte ) transferieren kann. Muss ich die werte in CDicomFile bestimmen und dann übergeben, wenn ja wie. Bis jetzt hab ich das immer über die Construktoren und vererbung gemacht aber irgendwie passt das meiner meinung nach hier nicht. Oder muss ich die werte erst in eight_bit_image einlesen und dann verwenden. Kann aber auch alles anders sein, ich versteh bis jetzt noch nicht so viel davon und lerne noch. Bin erst 7 wochen bei der c++ programmierung. Ich poste jede menge quellcode. Ich weiß ist wahrscheinlich recht kompliziert. Hoffe ihr könnt was damit anfangen.
Danke schoneinmal
Moritz
für euch von bedeutung werden sicher nur CDicomFile und Eight_bit_image sein. sorry das es soviel ist aber ich komme einfach schon seit tagen nicht mehr weiter.
habe jetzt einfach mal alle header und cpps hintereinander gepostet hoffe jetzt nicht allzuviel verwirrung gestiftet zu haben
danke sehr nochmal
ich weiß nicht ob es das alles bringt was ich hier tippe aber ich probier es trotzdem mal, weil ihr glaub ich nicht den ganzen gdcm klassenverband zur hand habt. Naja probieren wirs mal.
Also ich habe folgendes problem. Mein programm soll CT Bilder im Dicom format in eine Pixmap schreiben. Klappt auch schon. Eines kann mein programm jedoch noch nicht und zwar die größe dieser pixmap automatisch bestimmen. Mal 512*512 mal 256*256 je nach gegebendem bild halt.
Ich habe mir mein programm mehr oder weniger aus dem programm was ich ebenfalls poste, wie gesagt ich weiß nicht ob ihr was damit anfangen könnt, HelloVizWorld.cxx zusammengeklaubt. Da kommt auch der Befehl
const unsigned int *dims = image.GetDimensions(); vor.
Und damit habe ich auch mittels breakpoint bisher festgestellt das es mir damit möglich ist die größe des Feldes auf Variablen abzulegen z.b.:
m_iWidth = dims[0];
m_iHeight = dims[1];
so weit so gut jetzt der kern des problems. Da ich mein programm in insgesamt drei klassen unterteilt habe weiß ich nun nicht wie ich es machen kann das ich diese werte aus iWidth und iHeight in die klasse eight_bit_image (name passt nicht mehr so recht programm hat sich etwas größer entwickelt als ich dachte ) transferieren kann. Muss ich die werte in CDicomFile bestimmen und dann übergeben, wenn ja wie. Bis jetzt hab ich das immer über die Construktoren und vererbung gemacht aber irgendwie passt das meiner meinung nach hier nicht. Oder muss ich die werte erst in eight_bit_image einlesen und dann verwenden. Kann aber auch alles anders sein, ich versteh bis jetzt noch nicht so viel davon und lerne noch. Bin erst 7 wochen bei der c++ programmierung. Ich poste jede menge quellcode. Ich weiß ist wahrscheinlich recht kompliziert. Hoffe ihr könnt was damit anfangen.
Danke schoneinmal
Moritz
Code: Alles auswählen
#pragma once
class CDicomFile
{
public:
CDicomFile(int x, int y, int z);
~CDicomFile(void);
public:
int m_iWidth;
int m_iHeight;
short* m_pImageBuffer;
void OpenImage();
};
Code: Alles auswählen
#include "DicomFile.h"
#include <QFile>
#include <QMessageBox>
#include <QApplication>
#include <QFileDialog>
#include "gdcmImageReader.h"
#include "gdcmImageWriter.h"
#include "gdcmImage.h"
#include "gdcmPhotometricInterpretation.h"
CDicomFile::CDicomFile(int x, int y, int z)
{
m_pImageBuffer = NULL;
m_iWidth = x;
m_iHeight = y;
}
CDicomFile::~CDicomFile(void)
{
if (m_pImageBuffer != NULL)
delete[] m_pImageBuffer;
}
void CDicomFile::OpenImage()
{
QFile DataFile(QFileDialog::getOpenFileName(NULL, ("Open File"),
qApp->applicationDirPath(),
("Images (*.png *.xpm *.jpg *.raw *.dcm *.*)")));
gdcm::ImageReader reader;
reader.SetFileName( DataFile.fileName().toAscii() );
if( !reader.Read() )
{
QMessageBox::critical(NULL, "ACHTUNG", "Could not read File");
return;
}
gdcm::File &file = reader.GetFile();
const gdcm::Image &image = reader.GetImage();
unsigned int ndim = image.GetNumberOfDimensions();
const unsigned int *dims = image.GetDimensions();
if (m_pImageBuffer != NULL)
delete [] m_pImageBuffer;
m_pImageBuffer = new short[dims[0]*dims[1]];
m_iWidth = dims[0]; //<---- DIESE WERTE MUESSEN IN DIE KLASSE eight_bit_image
m_iHeight = dims[1]; //<-----
int iNum = image.GetBuffer((char*)(m_pImageBuffer));
}
Code: Alles auswählen
#pragma once
#include "DicomFile.h"
class CDicomImage : public CDicomFile
{
public:
CDicomImage(int x, int y, int z);
~CDicomImage(void);
public:
int GetWindowedPixel(int iX, int iY, int iWindowStart, int iWindowEnd, int iWindowChange);
int GetPixel(int x, int y, int z);
};
Code: Alles auswählen
#include "DicomImage.h"
#include "DicomFile.h"
CDicomImage::CDicomImage(int x, int y, int z) : CDicomFile(x, y, z)
{
}
CDicomImage::~CDicomImage(void)
{
}
int CDicomImage::GetWindowedPixel(int iX, int iY, int iWindowStart, int iWindowEnd, int iWindowChange)
{
int iOriginal = GetPixel(iX, iY, iWindowChange);
if (iOriginal < iWindowStart)
{
return 0;
}
else if (iOriginal > iWindowEnd)
{
return 255;
}
else
{
return (iOriginal - iWindowStart) * (255.0/(iWindowEnd-iWindowStart));
}
}
int CDicomImage::GetPixel(int x, int y, int z)
{
return m_pImageBuffer[x+y*512+z*512*512];
}
#ifndef EIGHT_BIT_IMAGE_H
#define EIGHT_BIT_IMAGE_H
Code: Alles auswählen
#include <QtGui/QWidget>
#include "ui_eight_bit_image.h"
#include "DicomImage.h"
#include "DicomFile.h"
class Eight_Bit_Image : public QWidget
{
Q_OBJECT
public:
Eight_Bit_Image(QWidget *parent = 0, Qt::WFlags flags = 0);
~Eight_Bit_Image();
CDicomImage* m_CDicom;
private:
Ui::Eight_Bit_ImageClass ui;
private slots:
void on_pushButton_loadImage_clicked();
void on_horizontalScrollBar_WindowStart_valueChanged(int iWindowStart);
void on_horizontalScrollBar_WindowEnd_valueChanged(int iWindowEnd);
void on_horizontalScrollBar_WindowChange_valueChanged(int iWindowChange);
void load_eight_bit();
};
#endif // EIGHT_BIT_IMAGE_H
Code: Alles auswählen
#include "eight_bit_image.h"
#include "dicomimage.h"
Eight_Bit_Image::Eight_Bit_Image(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
//m_iHeight = image.GetDimensions(); -> includes für GetDimensions einfügen (#include "gdcmPhotometricInterpretation.h")
//m_iWidth =
m_CDicom = new CDicomImage(512,512,130); //m_iWidth, m_iHeight, 130 // HIER WIRD DIE GRÖßE DER PIXMAP FESTGELEGT
}
Eight_Bit_Image::~Eight_Bit_Image()
{
delete m_CDicom;
}
void Eight_Bit_Image::on_pushButton_loadImage_clicked()
{
m_CDicom->OpenImage();
load_eight_bit();
}
void Eight_Bit_Image::load_eight_bit()
{
int iWindowStart = ui.horizontalScrollBar_WindowStart->value();
int iWindowEnd = ui.horizontalScrollBar_WindowEnd->value();
int iWindowChange = ui.horizontalScrollBar_WindowChange->value();
QImage image(512,512,QImage::Format_RGB32);
for (int x = 0; x<512; x++) // x<Width
{
for (int y = 0; y<512; y++) // y<Height
{
int iGrayValue = m_CDicom->CDicomImage::GetWindowedPixel(x,y, iWindowStart, iWindowEnd, iWindowChange);
image.setPixel(x, y, qRgb(iGrayValue, iGrayValue, iGrayValue));
}
}
ui.label_image->setPixmap(QPixmap::fromImage(image));
}
void Eight_Bit_Image::on_horizontalScrollBar_WindowStart_valueChanged(int)
{
if (ui.horizontalScrollBar_WindowStart->value() > ui.horizontalScrollBar_WindowEnd->value())
ui.horizontalScrollBar_WindowStart->setValue(ui.horizontalScrollBar_WindowEnd->value());
ui.lineEdit_WindowStart->setText(QString::number(ui.horizontalScrollBar_WindowStart->value()));
load_eight_bit();
}
void Eight_Bit_Image::on_horizontalScrollBar_WindowEnd_valueChanged(int)
{
ui.lineEdit_WindowEnd->setText(QString::number(ui.horizontalScrollBar_WindowEnd->value()));
load_eight_bit();
}
void Eight_Bit_Image::on_horizontalScrollBar_WindowChange_valueChanged(int)
{
ui.lineEdit_WindowChange->setText(QString::number(ui.horizontalScrollBar_WindowChange->value()));
load_eight_bit();
}
habe jetzt einfach mal alle header und cpps hintereinander gepostet hoffe jetzt nicht allzuviel verwirrung gestiftet zu haben
danke sehr nochmal