好奇,是否可以从NSMutableData获取[UIImage]

时间:2015-09-03 09:33:53

标签: ios nsinputstream nsmutabledata

在我的iOS端,我通过NSInputStream收到了一组图像。 NSMutableData将在[JPG IMAGE][JPG IMAGE][PNG IMAGE]中包含图片。

有没有优雅的方式从NSMutableData获取图像?

编辑:感谢所有的回复。我不知道图像的开始/结束。我将缓冲区转换为NSData并将其附加到NSMutableData。我是否需要在图像之间包含分隔符?

服务器(.Net):连续发送图片,因此在客户端(iOS)我永远不会遇到NSStreamEvent.EndEncountered。关闭NetoworkStream会让我ObjectDisposedException was unhandled, cannot access a disposed object (fixing it now)

客户端:不知道服务器何时完成发送,它只有一个NSMutableData(fixing it now)我将buffer转换为NSData并将其附加到NSMutableData

基本上我想要达到的目标是: 1.我在我的客户端(iOS app)上按连接, 2.与服务器建立连接(.Net) 3.服务器创建并向客户端发送图像 4.客户端显示图像。 5.客户端启动的连接和断开连接。

更新:我通过以下方式开展工作: 1.在服务器端,在每个图像发送后,我附加一个分隔符。 2.在客户端,我照常将数据附加到NSMutableData并检查delimeter的最后几个字节。如果匹配,我可以安全地继续通过分隔符对NSMutableData进行分块。

通过它,我能够收到&显示多个图像!

3 个答案:

答案 0 :(得分:1)

您可以使用

[UIImage imageWithData:[yourMutableData copy]]

没有必要复制。它使你的可变数据变得不可变,你得到了副本。

答案 1 :(得分:0)

您可以使用

NSData * data = yourData;

UIImage * image = [UIImage imageWithData:data];

答案 2 :(得分:0)

这是可能的,但在你的情况下会很棘手 - 因为你指出NSMutableData将包含多种类型的图像( JPEG / PNG < / em>的)。

如果我们假设数据格式良好,那么探索和分离数据的最佳方式是通过文件签名:

  1. 对于PNG,它是first 8 bytes
  2. 对于JPEG,它是first 4 bytes
  3. 将其合并以将大量数据分成数据块数组。您必须逐字节地查找子序列并检查子序列是否恰好是JPEG或PNG文件。然后简单地初始化您的UIImage对象:

    var dataArray: [NSMutableData] = [imageData1, imageData2, imageData3]
    var imageArray: [UIImage] = []
    
    for imgData in dataArray {
        if let image = UIImage(data: imgData) {
            imageArray.append(image) 
        }
    }