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