Datei einlesen und verwenden ??

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Moritz
Beiträge: 16
Registriert: 26. März 2009 18:00
Wohnort: Aachen

Datei einlesen und verwenden ??

Beitrag 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
Moritz
Beiträge: 16
Registriert: 26. März 2009 18:00
Wohnort: Aachen

Beitrag von Moritz »

achso ich benutze Qt 4.5 als Integration für VS 2008 Prof.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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));
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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();


}
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Moritz
Beiträge: 16
Registriert: 26. März 2009 18:00
Wohnort: Aachen

Beitrag von Moritz »

hey danke hat alles super geklappt- habt mir sehr geholfen
moritz
Antworten