【问题标题】:Sending UIImage over NSOutputStream [closed]通过 NSOutputStream 发送 UIImage [关闭]
【发布时间】: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.
  • 感谢两位的快速回复。我缩小了照片的尺寸,它可以正常工作。

标签: objective-c xcode nsstream nsoutputstream


【解决方案1】:

这是因为您的图片尺寸超出了限制。

更好的处理方法是实现以下逻辑。

发件人

  1. UIimage 转换为NSData

  2. NSData 拆分为不同的块(建议每个块1024 个)

  3. 发送和跟踪NSData的每一块

接收者

  1. 声明NSData并将NSData块(1024)的第一部分存储到其中,接收到。

  2. 接收NSData的下一个块并使用appendData:方法附加它

  3. 收到所有块后,将收到的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
    

    【讨论】:

    • 太棒了。我现在要使用它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多