2013-03-20 4 views
9

사용자가 서버로 가져 오는 이미지를 보내려고합니다. JPEG 표현을 얻은 다음 사진을 업로드하는 데 필요한 문자열에 추가 한 다음 NSOutputStream을 통해 데이터를 보냅니다. 그러나 서버에서 사진을 다시 가져 오려고하면 맨 위에있는 사진 중 10 % 만 볼 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.NSOutputStream을 통해 UIImage를 보내십시오.

btw. 소켓이 열려 있고 연결되어 있습니다.

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

다른 JPEG 압축을 시도해 보셨습니까? like (image, 0.4f) – ApolloSoftware

+0

크기 제한 임계 값 초과 여부 – ApolloSoftware

+0

이미지를 메모리 (버퍼)에 쓰고 복구 된 이미지를 렌더링하려고 할 수 있습니까? 메모리에서이 작업을 시도했지만 1024 x 683 사진에서는 정상적으로 작동했습니다. 다음은 몇 가지 샘플 코드입니다 : https://gist.github.com/abellina/5205633. – abellina

답변

3

나는 당신이 당신의 버퍼 한 번에 너무 많은 데이터를 쓰기 위해 노력하고 추측에는 요 :

여기 내 코드입니다. 데이터를 통해 루프 같은 것을 할 대신 덩어리를 보내

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

멋진. 나는 그것을 지금 사용하려고합니다! –

5

그것 때문에 당신의 이미지 크기 제한의의를 초과하고있다.

이 문제를 해결하는 더 좋은 방법은 다음과 같은 논리를 구현하는 것입니다.

은 보낸 사람

  1. UIimage-NSData

  2. 다른 덩어리에 NSData까지 분할 변환

  3. 하는 NSData

    의 각 청크를 & 트랙 보내기 (덩어리 당 1024 권장)
  4. ,515,

수신기

  1. NSData를 선언 수신 그것에 NSData 청크 (1024)의 첫 번째 부분을 저장한다.

  2. NSData의 다음 청크를 수신하고 만들어 사용에게 그것을

  3. 을 추가 할 appendData: 방법을 모든 덩어리가 수신되면, UIImage

로 수신 NSData 변환 다른 디자인하십시오 데이터를 나타내는 구조체 (전체 청크, 전체 크기, 청크 크기 등), 데이터를 나타내는 구조체 (현재 청크 크기, 현재 청크 번호 등), 구조를 나타내는 구조체 등의 청크로 데이터를 전송하기위한 구조 아르 자형 데이터 (배달 상태, 배달 된 청크 번호 등)를 응답합니다.

관련 문제