[solved] Array mit Bilddaten als Bild anzeigen lassen

Alles rund um die Programmierung mit Qt
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag von AndiLatte »

in der mainwindow.cpp sieht es so aus:

Code: Alles auswählen

MainWindow::MainWindow()
	: QMainWindow()
{

	pixels = 0;
...
..
.
}

Code: Alles auswählen

void MainWindow::set_image(image_t* image) {

if(pixels == 0) {

if(pixels != 0) delete [] pixels;

pixels = new unsigned char [image->info.size.u*image->info.size.v*4];

QImage video_pixmap(pixels, image->info.size.u, image->info.size.v, QImage::Format_RGB32);

}

int pixel_size = image->info.elemsize;

for (int i = 0; i < image->info.size.u*image->info.size.v; i++) {
	unsigned char gv = (unsigned char) (image->data[i*pixel_size]);
		pixels[i*4] = gv;
		pixels[i*4+1] = gv;
		pixels[i*4+2] = gv;
		pixels[i*4+3] = 0;
	}

QPixmap setPixmap(QPixmap::fromImage(video_pixmap));
setPixmap.save("temp.png","PNG");

delete[] pixels;

}
und in der mainwindow.h

Code: Alles auswählen

 #include <QPixmap>
#include <QImage>
..
public:
unsigned char* pixels;
.
private:
...
..
QPixmap *pixmap_video;
QImage video_pixmap;
..
.
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

Code: Alles auswählen

void MainWindow::set_image(image_t* image) {

  if(pixels == 0) {
    if(pixels != 0) delete [] pixels;
    pixels = new unsigned char [image->info.size.u*image->info.size.v*4];

    QImage video_pixmap(pixels, image->info.size.u, image->info.size.v, QImage::Format_RGB32);
  }

  int pixel_size = image->info.elemsize;

  for (int i = 0; i < image->info.size.u*image->info.size.v; i++) {
    unsigned char gv = (unsigned char) (image->data[i*pixel_size]);
    pixels[i*4] = gv;
    pixels[i*4+1] = gv;
    pixels[i*4+2] = gv;
    pixels[i*4+3] = 0;
  }

  QPixmap setPixmap(QPixmap::fromImage(video_pixmap));
  setPixmap.save("temp.png","PNG");

  delete[] pixels;
}
ich werd aus deinem code nich schlau :)

also in dem if-block if(pixels == 0) { ... } brauchst du kein delete - der pointer is ja NULL.
konsequenterweise ist die abfrage vor dem delete (if(pixels != 0) ...) quatsch, weil du in den block ja nur reinkommst wenn pixel==0 ist.
und als drittes ist diese zweite abfrage sowieso überflüssig, da das löschen eines NULL-zeigers erlaubt ist - passiert halt nix.

das folgende QImage video_pixmap(pixels, image->info.size.u, image->info.size.v, QImage::Format_RGB32);
müßte (wenn ich deine absicht richtig interpretiere) aber außerhalb des if(pixel==0)-blockes stehen, denn das setzen bzw. neusetzen des bildes soll ja auf alle fälle gemacht werden (genauso wie das umkodieren der daten in der for-schleife ... die steht ja auch nicht im if-block).
etwas unklar ist dabei auch, was du mit der QImage video_pixmap aus diesem if-block überhaupt machen willst, denn eigentlich stirbt diese instanz ja gleich danach am blockende. die verwendung in QPixmap settPixmap(QPixmap::fromImage(video_pixmap)); wäre so also nicht möglich (hier verwendet der compiler dann deine gleichlautende member-variable ... was natürlich keinen sinn bzw. keine wirkung hat).

die umkodierung ist auch komisch. du willst doch von RGBA auf ARGB umstellen, nutzt dabei den rot-kanal und willst ein grauwertbild d'raus machen. richtig ? müßten das dann nicht so aussehen ?

Code: Alles auswählen

  pixels[i*4] = 0;
  pixels[i*4+1] = gv;
  pixels[i*4+2] = gv;
  pixels[i*4+3] = gv; 
dein code setzt alpha, rot und grün und blendet blau aus - oder steh ich heut auf'm schlauch ?

in der zeile QPixmap setPixmap(QPixmap::fromImage(video_pixmap));
finde ich nur unpraktisch, daß die variable so heißt und so formatiert ist, wie eine funktion.

aber nach dem delete[] pixels; must du den pointer auf NULL setzen.
zum einen um sicherzustellen, daß du den bereich nicht ein zweites mal freigibst und zum zweiten, weil du den status des pointers für entscheidungen nutzt (am anfang der funktion).

du mußt erstmal den ganzen kuddel-muddel aufräumen, bevor es sinn macht nach dem eigentlichen SegFault zu suchen.


viel erfolg
Obel
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag von AndiLatte »

wenn ich mit dieser schleife das uchar array fülle

Code: Alles auswählen

  for (int i = 0; i < image->info.size.u*image->info.size.v; i++) {
    unsigned char gv = (unsigned char) (image->data[i*pixel_size]);
    pixels[i*4] = gv;
    pixels[i*4+1] = gv;
    pixels[i*4+2] = gv;
    pixels[i*4+3] = 0;
std::cout << pixels[i*4] << std::endl;
  } 
und mir das cout pro i nichts ausgibt scheint es doch klar warum ich kein bild zustande bekomme!
aber warum in gottes namen wird as array den nicht gefüllt. selbst mit dumy werten für gv passiert nichs :cry:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hst Du auch die Konsole offen (Qt-Doku CONFIG += console !)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag von AndiLatte »

Christian81 hat geschrieben:Hst Du auch die Konsole offen (Qt-Doku CONFIG += console !)
jau ist drin in der pro(ject) datei ! ich arbeite unter linux
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann nimm mal den gdb.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag von AndiLatte »

Christian81 hat geschrieben:Dann nimm mal den gdb.
huu. hab bisher noch nicht debuggen müssen.
wo hänge ich denn den gdb in den Makefile? oder wie ich rufe ich mmit ihm mein programmauf?
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag von AndiLatte »

das sagt der gdb

Code: Alles auswählen

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1223743792 (LWP 5616)]
0xb79de98a in QImage::QImage () from /usr/lib/libQtGui.so.4
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag von AndiLatte »

kaum zu glauben !
es lag an der qt version (siehe postings)
Antworten