通过 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将 64 位 int 值写入 NSOutputStream

NSOutputStream 没有调用委托的 NSStreamEventHasSpaceAvailable

NSOutputStream 发送旧值 - Objective C

通过 NSInputStream 和 NSOutputStream 进行视频流

iOS之通过NSOutputStream大文件下载

写入后 NSOutputStream 因访问错误而崩溃(Objective-c)