Seite 1 von 1

Datei einlesen und verwenden ??

Verfasst: 7. Mai 2009 09:34
von Moritz
Hallo,

ich habe ein Problem Dateien einzulesen. Ich habe es bisher geschafft einzelne Dateien die in meinem Debug Verzeichniss liegen mit QFile einzulesen. Nun soll ich das Programm umschreiben sodass der User auswählen kann welche Dateien man einlesen kann. Ich habe es mit QFileDialog::getOpenFileName probiert bekomme aber nicht die Verbindung hin wie ich die eingelesene Datei dann auch verwenden kann. Ich möchte eine 8bit oder 12bit raw Datei einlesen, welche Grauwerte von Bildern gespeichert habe. Diese sind 512x512 groß. Ich möchte sie in einer Pixmap einlesen. aber das klappt ja. Ich schaffe halt nur die Verbindung nicht. Hoffe ihr könnt mir helfen

hier der Code für das einlesen einer 8bit raw Datei:

#include "ct.h"
#include <QFile>
#include <QApplication>
#include <QMessageBox>
#include <QStringList>
#include <QFileDialog>
#include <QListWidget>

CT::CT(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
m_pImage = new char[512*512]; // für 8bit
m_pImage2 = new int[512*512]; // für 12bit
}

CT::~CT()
{
delete[] m_pImage;
delete[] m_pImage2;
}

void CT::on_pushButton_loadImage_EightBit_clicked()
{
// HIER MUESSTE EINGEFUEGT WERDEN DAS MAN ZWISCHEN
// VERSCHIEDENEN DATEIEN AUSWAEHLEN KANN
// VERSUCH MIT:
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
"/home",
tr("Images (*.png *.xpm *.jpg)"));

// UND
QStringList files = QFileDialog::getOpenFileNames(
this,
"Select one or more files to open",
"/home",
"Images (*.png *.xpm *.jpg)");

//Meine Frage wie bekomme ich die eingelesene Datei da hin wo im //Moment "/8bit.raw steht" ????
QFile DataFile(qApp->applicationDirPath().append("/8bit.raw"));

bool bFileOpen = DataFile.open(QIODevice::ReadOnly);
if (!bFileOpen)
{
QMessageBox::critical(this, "ACHTUNG", "Datei konnte nicht geöffnet werden");
return;
}

int iSize = sizeof(char/*short*/);
int iNum = DataFile.read((char*)m_pImage, 512*512*iSize);

loadImage_EightBit();
}

void CT::loadImage_EightBit()
{
QImage image(512,512,QImage::Format_RGB32);
for (int x = 0; x<512; x++)
{
for (int y = 0; y<512; y++)
{
int iGrayValue = m_pImage[x+y*512];
image.setPixel(x, y, qRgb(iGrayValue, iGrayValue, iGrayValue));
}
}
ui.label_image_EightBit->setPixmap(QPixmap::fromImage(image));
}


Ich hoffe ich habe alles verständlich erklärt

Moritz

Verfasst: 7. Mai 2009 09:39
von Moritz
achso ich benutze Qt 4.5 als Integration für VS 2008 Prof.

Verfasst: 7. Mai 2009 10:13
von AuE
warum nicht mit:

Code: Alles auswählen

QFile DataFile(QFileDialog::getOpenFileName(this, tr("Open File"), 
"/home", 
tr("Images (*.png *.xpm *.jpg)")));
zum 2 Punkt: Ich weiss nicht wie du 8 von 12bit unterscheiden kannst beim Datei auswählen (das gehts nur übers format).Allerdings kriegst du es doch beim einlesen raus oder?


Achja BITTE Codetags benutzen

Verfasst: 7. Mai 2009 10:19
von franzf
Ich glaub er will einfach statt

Code: Alles auswählen

QFile DataFile(qApp->applicationDirPath().append("/8bit.raw"));
das

Code: Alles auswählen

QFile DataFile(qApp->applicationDirPath().append(fileName));
Und mit der Liste musst du dir halt die einzelnen Dateinamen geben lassen (per index oder iterator), und dann einzeln verarbeiten.

Grüße
Franz

Verfasst: 7. Mai 2009 10:25
von AuE
Naja dann ist man aber immer an den App Pfad gebunden.... ist ja dann nicht mehr so schön ;-)

Man kann aber auch das hier machen :

Code: Alles auswählen

 QFile DataFile(QFileDialog::getOpenFileName(this, tr("Open File"),
                    qApp->applicationDirPath(),
               tr("Images (*.png *.xpm *.jpg)")));

BTW:

Der Value eines 8bit Grauwertes kann max 255 sein (Wertebereich der Pixel zwischen 0 .. 255) //S/W

Die Zeilen hier erachte ich mal für falsch....

Code: Alles auswählen

int iGrayValue = m_pImage[x+y*512]; 
image.setPixel(x, y, qRgb(iGrayValue, iGrayValue, iGrayValue));

Verfasst: 7. Mai 2009 10:50
von AuE
Einfacher Viewer:

Code: Alles auswählen

void Dialog::on_pushButton_clicked()
{

     QImage img(QFileDialog::getOpenFileName(this, tr("Open File"),
                    qApp->applicationDirPath(),
               tr("Images (*.png *.xpm *.jpg)")));

     ui->label->setPixmap( QPixmap::fromImage(img) );

     ui->label->adjustSize();
     this->adjustSize();
     this->adjustSize();


}

Verfasst: 7. Mai 2009 12:01
von RHBaum
m_pImage = new char[512*512]; // für 8bit
m_pImage2 = new int[512*512]; // für 12bit
und sowas gleich gar nicht angewoehnen !!!

Wenn buffer, dann bitte QByteArray oder std::vector<char>/ std::vector<int>

Ciao ...

Verfasst: 8. Mai 2009 09:41
von Moritz
hey danke hat alles super geklappt- habt mir sehr geholfen
moritz