Seite 1 von 1

[gelöst] QImage über QTcpSocket verschicken

Verfasst: 26. Mai 2009 11:07
von Rumbert
Hallo miteinander!

Mein Ziel ist es ein QImage von einer Serverapllikation an alle verbundenen Clients zu schicken (für den Anfang reicht auch erstmal an einen Client). Die Kommunikation mit QStrings hat bisher erfolgreich geklappt. Falls es wichtig ist, ich verwende QT 4.4.3 unter Vista.
Hier mein wesenlticher Code dazu:

Der Code auf der Serverseite

Code: Alles auswählen

void VideoServer::slotSendMessage(const QImage& image)
{
   // send a Message to all connected clients
	
   for (int i = 0; i < connectedSockets.count(); ++i)
   {
		QDataStream stream(connectedSockets[i]);
		
		stream << image;
               // stream << (QVariant) image; // brachte auch kein Erfolg
		QString saveName;
		int number = 200;
		saveName = QString("F:/Workcells_VERSOSIM/CamPics/test%1.jpg").arg(number,0,10);
		bool result = image.save(saveName);
		
	}
}
Der Code auf der Clientseite (zwei leider erfolglose Möglichkeiten):

Code: Alles auswählen

void VideoClient::con()
{
	number = 0;
	connectToServer("127.0.0.1", 5554);
	if (isConnected())
	{
		connect(&socket, SIGNAL(readyRead()),
            this, SLOT(slotReciveMessage()));
	}
}

void VideoClient::slotReciveMessage()
{
	QVariant variant;
	QImage image;
	QImage image2;
	QDataStream stream(&socket);
	while (!stream.atEnd())
	{
		stream >> image;
		stream >> value;
	}
	QImage image2 = variant.value<QImage>(); 

	QString saveName;
	number++;
	saveName = QString("F:/Workcells_VERSOSIM/CamPics/test%1.jpg").arg(number,0,10);
	bool result = image.save(saveName);
}
Das Ergbniss ist, dass auf der Serverseite das QImage noch korrekt ist (ich kann es erfolgreich abspeichern) auf der Clientseite hingegen gelange ich zwar in den Slot slotReciveMessage(), aber das QImage ist und bleibt immer null.
Hat jemand eine Idee was ich ausprobieren könnte oder wie ich die Ursache des Problems finden könnte?

Bin für jeden Tipp dankbar!
Grüße Rumbert

Verfasst: 26. Mai 2009 11:28
von Christian81
readyRead() heißt nicht zwangsläufig dass schon alle Daten da sind (das hatten wir vor kurzem schonmal -> Suchen :) )

Verfasst: 26. Mai 2009 11:29
von Mani99
Hi,

über sockets versendest du ein bytearray.

Das ist jetzt nur aus der doku zusammengesucht und aus dem gedächtnis gebaut, also ohne gewähr und ungetestet!

QImage in ein bytearray verwandeln:

Code: Alles auswählen

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG"); // writes image into ba in PNG format

Code: Alles auswählen

QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out<<(quint16)0;
out<<buffer;
out<<(uint16)(block.size()-sizeof(quint16));
und dann schreibst du das mit tcpsocket.write oä.

Verfasst: 27. Mai 2009 10:57
von Rumbert
Vielen Dank für die Hinweise!
Ich werde da mal ein wenig herumbasteln :-)

Grüße Rumbert

Verfasst: 27. Mai 2009 11:05
von Mani99
Nur noch als hinweis zu dem zweiten codeblock den ich dir gepostet habe: Alles was du reinschreibst, musst du auch so wieder rauslesen!