2013-03-20 14 views
9

Ich versuche, ein Bild zu senden, das Benutzer auf den Server nimmt. Ich erhalte die JPEG-Darstellung, füge diese an die Zeichenfolge an, die zum Hochladen des Fotos benötigt wird, und sende die Daten dann über NSOutputStream. Wenn ich jedoch versuche, das Foto vom Server wiederherzustellen, sehe ich nur 10% davon von oben. Jede Hilfe wäre willkommen.Senden von UIImage über NSOutputStream

btw. Steckdose ist offen und verbunden.

Hier ist mein Code:

NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID]; 
NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding]; 

NSData *imgData = UIImageJPEGRepresentation(image, 1.0); 

NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]]; 
[completeData appendData:imgData]; 

//sending NSData over to server 
[self.outputStream write:[completeData bytes] maxLength:[completeData length]]; 
+0

haben Sie verschiedene JPEG-Komprimierung ausprobiert? like (image, 0.4f) – ApolloSoftware

+0

Ich frage mich, ob der Schwellenwert für die Größenbeschränkung überschritten wird – ApolloSoftware

+0

Können Sie versuchen, das Bild in den Speicher (Puffer) zu schreiben und zu versuchen, das wiederhergestellte Bild zu rendern? Ich habe versucht, dies in Erinnerung zu tun und es funktionierte gut für ein 1024 x 683 Foto. Hier ein Beispielcode: https://gist.github.com/abellina/5205633. – abellina

Antwort

3

Ich würde vermuten, Sie sind einfach zu viele Daten zu einer Zeit, für Ihren Puffer zu schreiben versucht. Tun Sie etwas, wie diese Schleife über die Daten und senden Sie es in Stücke statt:

NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID]; 
    NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding]; 

    NSData *imgData = UIImageJPEGRepresentation(image, 1.0); 

    NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]]; 
    [completeData appendData:imgData]; 

    NSInteger bytesWritten = 0; 
    while (completeData.length > bytesWritten) 
    { 
     while (! self.outputStream.hasSpaceAvailable) 
      [NSThread sleepForTimeInterval:0.05]; 

     //sending NSData over to server 
     NSInteger writeResult = [self.outputStream write:[completeData bytes]+bytesWritten maxLength:[completeData length]-bytesWritten]; 
     if (writeResult == -1) { 
      NSLog(@"error code here"); 
     } 
     else { 
      bytesWritten += writeResult; 
     } 
    } 
} 
// Both input and output should be closed to make the code work in swift 
+0

Wunderbar. Ich werde das jetzt benutzen! –

5

Es ist wegen Ihrer Bildgröße Grenze überschritten wird.

Besserer Weg, dies zu handhaben, ist die folgende Logik zu implementieren.

Sender

  1. konvertieren UIimage zu NSData

  2. die NSData auf verschiedene Stücke Aufgeteilt (1024 pro Chunk empfohlen)

  3. senden & Spur jedes Stück NSData

Receiver

  1. Deklarieren NSData und Speichern des ersten Teils des NSData chunk (1024) hinein, die empfangen wird.

  2. Erhalten Sie die nächsten Stücke von NSData und Verwendung appendData: Verfahren machen es

  3. anhängen Nachdem alle Stücke empfangen werden, wandeln die empfangenen NSData als UIImage

Stellen Sie sicher, anders zu entwerfen Strukturen für die Übertragung der Daten als Chunks wie Struktur zur Darstellung der Details (Gesamtstück, Gesamtgröße, Stückgröße usw.), Struktur zur Darstellung der Daten (aktuelle Stückgröße, aktuelle Stückzahl etc ..), Struktur zur Darstellung der r esponds Daten (Lieferstatus, Chunk-Nummer geliefert etc ..).