【问题标题】:Why does QLPreviewRequestSetDataRepresentation on Mavericks return error " CGImageCreate: invalid image size: 0 x 0" for png为什么 Mavericks 上的 QLPreviewRequestSetDataRepresentation 返回错误“CG​​ImageCreate: invalid image size: 0 x 0” for png
【发布时间】:2014-07-02 08:30:07
【问题描述】:

我的快速查看生成器以前可以正常工作,但现在坏了。
这是一个错误还是我做错了什么?

这是我的代码:

OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef 预览, CFURLRef 网址,CFStringRef contentTypeUTI, CFDictionaryRef 选项){ NSDictionary * myDoc = [NSDictionary dictionaryWithContentsOfURL:(NSURL *)url]; 如果(我的文档){ NSData * pngData = [myDoc valueForKey:@"pngPreview"]; 如果(png数据){ QLPreviewRequestSetDataRepresentation(preview,(__bridge CFDataRef)pngData, kUTTypeImage,NULL); } } }

我的文档是一个普通的 plist,其中存储了一个 png 预览作为数据。
我检查了 pngPreview 确实包含 png 数据,我创建了图像,它的大小是 350×350。

但是,我经常收到这些错误:

qlmanage[702]:CGImageCreate:无效图像尺寸:0 x 0。
qlmanage[702:303] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9e27, name = 'com.apple.tsm.portname' 有关错误代码,请参见 /usr/include/servers/bootstrap_defs.h。
qlmanage[702:303] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x3f2b, name = 'com.apple.CFPasteboardClient' 有关错误代码,请参见 /usr/include/servers/bootstrap_defs.h。
qlmanage[702:303] 无法为 com.apple.CFPasteboardClient 分配通信端口;这可能是由于沙盒限制

我的应用没有沙盒化,所以我认为最后 3 个错误并不重要。

我曾经使用 kUTTypePNG,但尝试使用 kUTTypeImage 无济于事(QLPreviewRequestSetDataRepresentation 的文档说当前支持的 UTI 是 kUTTypeImage、kUTTypePDF、kUTTypeHTML、kUTTypeXML、kUTTypePlainText、kUTTypeRTF、kUTTypeMovie 和 kUTTypeAudio)。

其他需要考虑的点: 文档状态: “Quick Look 生成器的二进制文件必须是通用的,并且只能是 32 位的。” This page 但是this page 声明: “对于 OS X v10.6 及更高版本,您必须为 32 位和 64 位构建 Quick Look 生成器。”哪个不太清楚...
如何设定目标?

【问题讨论】:

  • 如果它曾经可以工作,那么这是一个错误。二进制兼容性很重要。您是否在 bugreport.apple.com 提交了错误?
  • 谢谢,我会这样做并告诉他们也更新文档:所有内容都是为旧 Xcode 提供的,尤其是如何调试文档具有误导性。
  • @wdyp 如果可以,请在OpenRadar 上发帖,以便其他人可以跟踪该错误!
  • 有这方面的消息吗?我面临同样的问题。谢谢
  • 我正在等待优胜美地可能纠正这个错误......

标签: osx-mavericks quicklook


【解决方案1】:

面对同样的问题,我决定另辟蹊径:使用 QLPreviewRequestCreateContext 获取在其中绘制图像的上下文:

QLPreviewRequestRef preview; // The preview request passed to GeneratePreviewForURL()
CGImageRef image;  // Create your CGImage however you like
CGSize size = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image));
CGContextRef ctxt = QLPreviewRequestCreateContext(preview, size, YES, nil);
CGContextDrawImage(ctxt, CGRectMake(0, 0, size.width, size.height), image);
QLPreviewRequestFlushContext(preview, ctxt);
CGContextRelease(ctxt);

至少那行得通……

【讨论】:

  • 谢谢!我不知道如何使用 QLPreviewRequestCreateContext 来做到这一点。你能发布一些代码吗?我会把它标记为我问题的好答案!谢谢!
  • 我在上面的答案中添加了一个代码示例,希望对您有所帮助
  • 感谢分享!所以我试了一下,我得到了这个错误...... :CGContextDrawImage:无效的上下文0x0。这是一个严重的错误。此应用程序或它使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。这将成为即将到来的更新中的致命错误。 [警告] 在没有创建上下文时刷新 的预览上下文
  • 也许我没有从我的 NSData 中正确创建图像……我是这样做的:CFDataRef imgData = (__bridge CFDataRef)pngData;CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData (imgData);CGImageRef image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
  • 显然 QLPreviewRequestCreateContext 返回一个 nil 上下文。检查您提供的大小不是 (0,0)。不过,您创建图像的方式似乎还可以。
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2020-02-01
相关资源
最近更新 更多