【问题标题】:Curious, is it possible to get [UIImage] from NSMutableData好奇,是否可以从 NSMutableData 获取 [UIImage]
【发布时间】:2015-09-03 09:33:53
【问题描述】:

在我的 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 分块。

通过它,我可以接收和显示多个图像!

【问题讨论】:

标签: ios nsinputstream nsmutabledata


【解决方案1】:

你可以使用

[UIImage imageWithData:[yourMutableData copy]]

不需要复制。它使您的可变数据变为不可变数据,并且您获得了副本。

【讨论】:

    【解决方案2】:

    你可以使用

    NSData *data = yourData;

    UIImage *image = [UIImage imageWithData:data];

    【讨论】:

      【解决方案3】:

      这是可能的,但在您的情况下会非常棘手 - 因为您指出 NSMutableData 将包含不止一种类型的图像(JPEG/PNG)。

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

      1. 对于 PNG,它是 first 8 bytes
      2. 对于 JPEG,它是 first 4 bytes

      合并它以将大量数据分成一组数据块。您必须逐字节查找子序列并检查子序列是否恰好是 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) 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2010-12-07
        • 2020-12-16
        • 1970-01-01
        相关资源
        最近更新 更多