如何获取中的错误/警告
我有一个MJPEGstream超过RTSP / UDP从中我想为[UIImage initWithData:]生成UIImageView的JPEG。 大多数情况下,这工作正常,但有时我得到像下面的腐败的图像和日志消息:
ImageIO: <ERROR> JPEGCorrupt JPEG data: premature end of data segment
我的问题是:我怎么看(在运行时),这样的消息发生? 不幸的是,'initWithData'没有错误输出,有没有其他方法?
谢谢。
编辑:在这种情况下,initWithData确实返回一个有效的UIImage对象,而不是零!
在堆栈溢出中有一个类似的线程: 捕捉错误:损坏的JPEG数据:数据段的提前结束 。
有解决办法是检查头字节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"); }
希望这可以帮助!
在这种情况下, initWithData:
方法应该返回nil
。
试试:
UIImage *myImage = [[UIImage alloc] initWithData:imgData]; if(!myImage) { // problem }
我在这种情况下遇到了同样的问题。
事实certificate,我正在传递一个NSMutableData的实例全局队列解码。 在解码期间,NSMutableData中的数据被从networking接收到的下一帧覆盖。
我通过传递数据的副本来解决错误。 使用缓冲池来提高性能可能会更好:
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 }); });