通过 NSOutputStream 发送 UIImage [关闭]
Posted
技术标签:
【中文标题】通过 NSOutputStream 发送 UIImage [关闭]【英文标题】:Sending UIImage over NSOutputStream [closed] 【发布时间】:2013-03-20 14:52:26 【问题描述】:我正在尝试将用户拍摄的图像发送到服务器。我得到 JPEG 表示,将其附加到上传照片所需的字符串,然后通过 NSOutputStream 发送数据。但是,当我尝试从服务器取回照片时,我只能从顶部看到 10% 的照片。任何帮助将不胜感激。
顺便说一句。套接字已打开并已连接。
这是我的代码:
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]];
【问题讨论】:
您尝试过不同的 JPEG 压缩吗?喜欢(图片,0.4f) 不知道是不是超过了大小限制阈值 您可以尝试将图像写入内存(缓冲区)并尝试渲染恢复的图像吗?我尝试在内存中执行此操作,它适用于 1024 x 683 照片。这是一些示例代码:gist.github.com/abellina/5205633. 感谢两位的快速回复。我缩小了照片的尺寸,它可以正常工作。 【参考方案1】:这是因为您的图片尺寸超出了限制。
更好的处理方法是实现以下逻辑。
发件人
将UIimage
转换为NSData
将NSData
拆分为不同的块(建议每个块1024 个)
发送和跟踪NSData
的每一块
接收者
声明NSData
并将NSData
块(1024)的第一部分存储到其中,接收到。
接收NSData
的下一个块并使用appendData:
方法附加它
收到所有块后,将收到的NSData
转换为UIImage
确保设计不同的结构来将数据传输为块,例如表示细节的结构(总块、总大小、块大小等),表示数据的结构(当前块大小、当前块数量等) ..),表示响应数据的结构(交付状态、交付的块数等)。
【讨论】:
【参考方案2】:我猜你只是想一次为缓冲区写入太多数据。做这样的事情来循环数据并以块的形式发送它:
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
【讨论】:
太棒了。我现在要使用它!以上是关于通过 NSOutputStream 发送 UIImage [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
NSOutputStream 没有调用委托的 NSStreamEventHasSpaceAvailable
NSOutputStream 发送旧值 - Objective C