3

我有一个通过 RTSP/UDP 的 MJPEG 流,我想从中为带有 [UIImage initWithData:] 的 UIImageView 生成 JPEG。大多数时候这很好用,但有时我会收到损坏的图像和日志消息,例如:

ImageIO: <ERROR> JPEGCorrupt JPEG data: premature end of data segment

我的问题是:我如何才能看到(在运行时)出现这样的消息?不幸的是'initWithData'没有错误输出,还有其他方法吗?

谢谢你。

编辑:在这种情况下, initWithData 确实返回了一个有效的 UIImage 对象,而不是零!

4

3 回答 3

2

堆栈溢出有一个与此类似的线程:Catching error: Corrupt JPEG data:premature end of data segment

解决方案是检查标头字节FF D8和结束字节FF D9。所以,如果你在 NSData 中有图像数据,你可以像这样检查它:

- (BOOL)isJPEGValid:(NSData *)jpeg {
    if ([jpeg length] < 4) return NO;
    const char * bytes = (const char *)[jpeg bytes];
    if (bytes[0] != 0xFF || bytes[1] != 0xD8) return NO;
    if (bytes[[jpeg length] - 2] != 0xFF || bytes[[jpeg length] - 1] != 0xD9) return NO;
    return YES;
}

然后,要检查 JPEG 数据是否无效,只需编写:

if (![self isJPEGValid:myData]) {
    NSLog(@"Do something here");
}

希望这可以帮助!

于 2011-07-22T13:43:38.777 回答
1

在这种情况下,该initWithData:方法应该返回。nil

尝试 :

UIImage *myImage = [[UIImage alloc] initWithData:imgData];
if(!myImage) {
    // problem
}
于 2011-07-22T09:37:14.807 回答
-1

在这种确切的情况下,我遇到了同样的问题。

原来,我正在将 NSMutableData 的一个实例传递给全局队列进行解码。在解码期间,NSMutableData 中的数据被从网络接收到的下一帧覆盖。

我通过传递数据的副本修复了错误。使用缓冲池来提高性能可能会更好:

    NSData *dataCopy = [_receivedData copy];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    ZAssert([self isJPEGValid:dataCopy], @"JPEG data is invalid"); // should never happen
    UIImage *image = [UIImage imageWithData:dataCopy];
    dispatch_async(dispatch_get_main_queue(), ^{
        // show image
    });
});
于 2013-11-23T16:54:21.947 回答