An was und vorallem wie übergebe ich das Array an "QT".
Das Example basicdrawing hab ich mir angeschaut komme bekomme die Brücke zum Pixel-Array-Anzeigen aber nicht hin.
Ich bin für jeden Hinweis dankbar!
Code: Alles auswählen
QImage::QImage ( const uchar * data, int width, int height, Format format )Code: Alles auswählen
QImage video_pixmap(pixels, image->info.size.u, image->info.size.v, QImage::Format_RGB32);Code: Alles auswählen
pixmap_video = new QPixmap;
pixmap_videoLabel = new QLabel;
pixmap_videoLabel->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
pixmap_videoLabel->setBackgroundRole(QPalette::Dark);
pixmap_videoLabel->setAutoFillBackground(true);
pixmap_videoLabel->setMinimumWidth(512);
pixmap_videoLabel->setMinimumHeight(256);Code: Alles auswählen
void MainWindow::set_image(image_t* image)
{
unsigned char* pixels;
pixels = new unsigned char [image->info.size.u*image->info.size.v*4];
for (int i = 0; i < image->info.size.u*image->info.size.v; i++)
{
unsigned char gv = (unsigned char) (image->data[i]);
pixels[i*4] = gv;
pixels[i+1*4] = gv;
pixels[i+2*4] = gv;
pixels[i+3*4] = 0;
}
QImage video_pixmap(pixels, image->info.size.u, image->info.size.v, QImage::Format_RGB32);
QPixmap setPixmap(QPixmap::fromImage(video_pixmap));
}Code: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4]; 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]);
pixels[i*4] = gv;
pixels[i+1*4] = gv;
pixels[i+2*4] = gv;
pixels[i+3*4] = 0;
}
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]);
pixels[i*4] = gv;
pixels[i*4+1] = gv;
pixels[i*4+2] = gv;
pixels[i*4+3] = 0;
}
Volker hat geschrieben:Das kann zwar viele Ursachen haben, aber was mir spontan auffällt:
Wo wird der hier angelegte Speicher wieder freigegeben?Code: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4];
Code: Alles auswählen
if(pixels != 0){delete pixels;}
pixels = new unsigned char [image->info.size.u*image->info.size.v*4]; Code: Alles auswählen
*** glibc detected *** ............. free() : invalid pointer .... ***Code: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4]; delete pixels;
Macht SinnVolker hat geschrieben:Sollte es da nicht eher heißen: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]); pixels[i*4] = gv; pixels[i+1*4] = gv; pixels[i+2*4] = gv; pixels[i+3*4] = 0; }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]); pixels[i*4] = gv; pixels[i*4+1] = gv; pixels[i*4+2] = gv; pixels[i*4+3] = 0; }
Code: Alles auswählen
*** glibc detected *** ............. free() : invalid pointer .... ***Code: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4];
QImage video_pixmap([b]pixels[/b], image->info.size.u, image->info.size.v, QImage::Format_RGB32);
QPixmap setPixmap(QPixmap::fromImage(video_pixmap)); Code: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4];
QImage video_pixmap(image->info.size.u, image->info.size.v, QImage::Format_RGB32);
QPixmap setPixmap(QPixmap::fromImage(video_pixmap)); Code: Alles auswählen
int width = 300;
int height = 200;
unsigned char *pixels = new unsigned char [width*height*4];
for (int i = 0; i < width*height; i++)
{
unsigned char gv = 0x3f;
pixels[i*4] = gv;
pixels[i*4+1] = gv;
pixels[i*4+2] = gv;
pixels[i*4+3] = 0;
}
QImage video_pixmap(pixels, width, height, QImage::Format_RGB32);
QPixmap setPixmap(QPixmap::fromImage(video_pixmap));
setPixmap.save("temp.png", "PNG");
delete[] pixels;
deinem posting vom Mo Jan 21, 2008 16:13 ist zu entnehmen, daß pixel ne lokale variable ist. diese vor dem new zu deleten macht nicht nur keinen sinn, es ist richtig gefährlich, denn der compiler ist nicht verpflichtet pointer von sich aus mit NULL zu initialisieren. da löscht du dann sonstwo nen byte weg. und keinen sinn macht es, weil es ne lokalel variable ist. du kannst also nicht den bereich "vom letzten mal" löschen bevor du ihn neu benutzt. und zum dritten löscht man arrays mit delete [] und nicht mit delete !AndiLatte hat geschrieben:Volker hat geschrieben:Das kann zwar viele Ursachen haben, aber was mir spontan auffällt:Wo wird der hier angelegte Speicher wieder freigegeben?Code: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4];ergibt wohl ne (ehr böse) Fehlermeldung (über die ich dennoch dankbar bin)Code: Alles auswählen
if(pixels != 0){delete pixels;} pixels = new unsigned char [image->info.size.u*image->info.size.v*4];Code: Alles auswählen
*** glibc detected *** ............. free() : invalid pointer .... ***
pixels=new ... direkt gefolgt von einem delete ? ist das nur nen fehler im posting oder steht das so in deinem code ?AndiLatte hat geschrieben:ergibt den Speicherzugrifsfehler wie zuvorCode: Alles auswählen
pixels = new unsigned char [image->info.size.u*image->info.size.v*4]; delete pixels;