如何将 (OS_dispatch_data *) 5018112 字节转换为 NSData 以放入 UIImage?

10
我一直在寻找答案,有些看起来似乎是我需要的,但我不确定。我找到了这个问题#9152851和这个问题#2617625,并在许多链接中查找,但我需要一些指引。
本质上,我正在调度异步调用以使用OpenCV处理图像。您可以通过此处的代码看出,在将其发送回我的委托之前,我将其转换为NSData *。
NSData *proccessedData = [NSData dataWithBytes:processedImage.data length:(processedImage.rows * processedImage.cols)];        
[self.delegate onProcessedBitmapReady:proccessedData withFocusQuality:focusQuality];

但是当我回到我的委托对象时,我的 processedBitmap 的类型为 (OS_dispatch_data *),包含一组字节。所以,当我尝试设置 UIImage 时,它被设置为空。

- (void)onProcessedBitmapReady:(NSData *)processedBitmap withFocusQuality:(double)focusQuality
{
    //Use comverted image from self.captureCommand onComplete
    UIImage *image = [[UIImage alloc] initWithData:processedBitmap];
    [self saveImage:image];
}

这是数值的屏幕截图:

Imgur

那么,我该如何将这些字节(或其他内容)转换为可以放入UIImage中的内容呢?

感谢您的帮助。

------------------------------------------------------- 添加新图片 -----------------------------------------

My Bytes

这张新图片有用吗?

谢谢。


onProcessedBitmapReady方法是否保留NSData对象?NSData对象是否在其他地方被保留?您是否使用ARC? - Ramy Al Zuhouri
看起来像是内存被回收了,你的NSData没有被正确地保留。 - Léo Natan
我的processedBitmap是我的NSData。我在其中看到了5018112个字节。唯一奇怪的是它的类型是OS_dispatch_data *。这是否意味着内存已被回收? - Patricia
好的。我创建了一个带有(nonatomic, strong)属性,现在我从我的对象中检索该值,它仍然显示为类型OS_dispatch_data *。这可能只是因为我正在使用GCD调用异步调用吗? - Patricia
@JustSid - 你说得对!我必须使用CGBitmapContextCreate创建CGContextRef,然后使用CGBitmapContextCreateImage创建CGImageRef,最后使用imageWithCGImage创建UIImage。回答问题,我会给你积分。 - Patricia
显示剩余3条评论
1个回答

11

NSData 实际上是一个类簇提供接口,其周围有多个特殊实现。看起来 OS_dispatch_data 是这样的一种特殊实现,用于在块之间传递数据对象,特别是因为您的 UIImage 创建不会崩溃(如果您传递了非 NSData 对象或仅仅是垃圾内存会导致崩溃)。相反,UIImage 看起来只是不认识图像所处的格式!

顺便说一下,苹果有一个关于类簇概念的很好的指南,可以在这里找到。


6
具体来说,OS_dispatch_data是来自于libdispatch的dispatch_data_t类型。在iOS 7和Mavericks系统中,dispatch data可以自由转换为NSData类型,并且实际上是NSData的子类(当然,前提是在进程中链接了Foundation库)。 - Catfish_Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接