2016-07-05 30 views
0

ändern Ich versuche, ein Bild über einen Eingangsstrom abrufen und dann meine ImageView zu diesem Bild festlegen. Im Folgenden finden Sie meinen Code zum Abrufen des Eingabestreams und zum Lesen der Daten.Kann meine ImageView nicht zu Daten aus Stream in Swift

let bufferSize = 1024 
    var buffer = Array<UInt8>(repeating: 0, count: bufferSize) 

    while (inputStream.hasBytesAvailable){ 
     let len = inputStream.read(&buffer, maxLength: buffer.count) 
     if(len > 0){ 
      let imageData = NSData(bytes: &buffer, length: buffer.count) 
      print("\(imageData)") 
      let newImage = UIImage(data: imageData as Data) 
      ImageView.image = newImage 
     } 
    } 

Ich benutze die CFStream als Sockets zum Empfangen von Daten. All dies funktioniert gut, da ich alle meine anderen Daten senden und empfangen kann, aber aus irgendeinem Grund nicht das Bild.

Vielen Dank.

UPDATE.

Der Code von unten wirft keine Fehler, aber das Bild wird immer noch nicht angezeigt. Ist irgendetwas mit meinem Servercode nicht in Ordnung?

 f = open("/home/pi/Documents/server/foo.jpg", "rb") 
     byte = f.read() 
     print "Done reading" 
     self.transport.write(byte) 
     f.close() 
     print "Done sending" 

Der Server-Code wird in Twisted-Python geschrieben und die Verbindung funktioniert entsprechend, da ich in der Lage bin andere Nachrichten zu übertragen, als das Bild.

+0

'inputStream.read (& buffer, maxLength: buffer.count)' liest bis zu 'buffer.count' (= 1024) Bytes. Ist Ihr Bild kleiner als 1024 Bytes? – OOPer

+0

Nein, aber es liest weiter, bis der inputStream leer ist, oder? – Oliver

+0

In Ihrem Code lesen Sie weiterhin aus dem inputStream, aber Sie versuchen, Ihr Bild mit jedem Datenfragment zu erstellen, das kleiner oder gleich 1024 Bytes ist. Möglicherweise müssen Sie alle Datenfragmente in einer einzigen Datengruppe zusammenfassen, und nach dem Lesen aller Datenfragmente müssen Sie die gesammelten Daten (nicht die letzten Datenfragmente) in UIImage konvertieren. – OOPer

Antwort

1

So, das Datenfragment in einer Daten zu sammeln, müssen Sie so etwas schreiben:

let bufferSize = 1024 
    var buffer = Array<UInt8>(repeating: 0, count: bufferSize) 
    //You need to assign an actual Data to the variable. 
    //With initial value given, you have no need to work with Optionals. 
    var imageData = Data() 
    while (inputStream.hasBytesAvailable){ 
     let len = inputStream.read(&buffer, maxLength: buffer.count) 
     if(len > 0){ 
      imageData.append(&buffer, count: buffer.count) 
     } 
    } 
    //You need to try converting the data to image after reading all data fragments. 
    let newImage = UIImage(data: imageData) 
    pictureView.image = newImage 

Wenn Sie andere Probleme mit diesem Code finden, bitte als Kommentar zu dieser Antwort melden.

+0

Es werden keine Fehler ausgegeben, aber das Bild ist leer. Ich habe versucht zu sehen, ob irgendetwas mit meinem Servercode nicht stimmt, aber ich kann keine Fehler finden. Ich werde auch meinen Server Code hochladen, geschrieben mit Twisted in Python – Oliver

+0

Ich weiß nicht, wie Twisted Python ist, aber was ist die Größe von 'Byte' in Ihrem Python-Code, und wie lang ist die' ImageData' nur vor der Konvertierung in UIImage? – OOPer

0

Mein Fehler war nicht jedes Byte der Datei senden. Wenn ich meinen Server-Code geändert habe:

with open("/home/pi/Documents/server/foo.jpg", "rb") as f: 
    byte = f.read() 
    print "Done reading" 
    while byte: 
     self.transport.write(byte) 
     byte = f.read(1) 
    print "Done sending" 
f.close() 

Es hat gut funktioniert. Ich werde jedoch die folgende Antwort akzeptieren, da es möglicherweise ein Problem mit dem Lesen meiner Daten in der neuen Bilddatei war.