ich habe ein Programm geschrieben, welches von einem anderen PC Bilder erhält, und diese dann anzeigt.
Prinzip: Socket aufbauen, auf Daten warten, wenn das Bild da ist, das Bild ein bisschen manipulieren (zB. einzelne Punkte im Bild einfärben) und anzeigen.
Idee: ImageViewer kreiieren (von QWidget abgeleitet). Dieser beinhaltet verschiedene Labels (Beschriftung / Bilder):
Code: Alles auswählen
ImageViewer::ImageViewer(QWidget* parent, const char* name, WFlags fl )
: QMainWindow( parent, name, fl )
{
if ( !name )
setName( "ImageViewer" );
setCentralWidget( new QWidget( this, "qt_central_widget" ) );
Text1Label = new QLabel(centralWidget(), "Text1");
Text1Label->setText("Originalbild mit Kanten");
Text1Label->setGeometry(QRect(10,0,320,20));
PictureLabel = new QLabel( centralWidget(), "PictureLabel" );
PictureLabel->setGeometry( QRect( 10, 20, 320, 200 ) );
PictureLabel->setPixmap( QPixmap::fromMimeSource( "testimage.ppm" ) );
PictureLabel->setScaledContents( TRUE );
...
In diesem wird das Bild vom PORT gelesen und in ein image gespeichert.
Um die einzuzeichnenden Punkte berechnen zu können wird aus diesem Image ein Binärbild erstellt und dann die Punkte bestimmt. (ist im Code nicht enthalten...)
Das Bild wird dann einem Pixmap übergeben und in diesem Pixmap die Pixel gesetzt.
Code: Alles auswählen
void QUDPthread::run(){
sd = new QSocketDevice(QSocketDevice::Datagram);
ha = new QHostAddress();
sd->bind(ha->ip4Addr(), PORT);
image = new QImage();
image1 = new QImage();
pm = new QPixmap();
while(1) {
rc = 0;
while(sd -> bytesAvailable()){
usleep(100);
rc = sd->readBlock(buffer,sd -> bytesAvailable());
}
if(rc > 0){
datei = open("testimage.ppm",O_WRONLY|O_CREAT,0700);
write(datei,&buffer,rc);
close(datei);
image->load("testimage.ppm", "PPM");
// Binärbild erstellen, Punkte berechnen etc...
image1->load("white.ppm", "PPM");
for(y=0; y<WINDOWHEIGHT;y++){
for(x=0; x<WINDOWWIDTH;x++){
if(bpicture->bin_pic[y*WINDOWWIDTH+x]==0x00)
image1->setPixel(x,y,0);
}
}
pm->convertFromImage(*image1, QPixmap::Color);
image1->reset();
Iv->Binary1Label->setPixmap(*pm);
}
usleep(1000);
}
}
Code: Alles auswählen
int main( int argc, char ** argv )
{
QUDPthread UDPThread;
QApplication a( argc, argv );
ImageViewer Iv;
a.setMainWidget(&Iv);
Iv.show();
UDPThread.init(&Iv);
UDPThread.start();
a.exec();
return 0;
}
Ab und an tritt ein Fehler auf. Manchmal nach 1 min, manchmal nach 5 min...
X Error: BadRequest (invalid request code or no such operation) 1
Major opcode: 0
Minor opcode: 0
In file kernel/qpixmap_x11.cpp, line 632: Out of memory
Segmentation fault
Weiss jemand woher der Fehler kommt?
System: suse 9.0, qt3.0
Gruss Soc