如何使用 Quartz 2D 和 Grand CEntral Dispatch 以编程方式生成 UIImage
现在,我已经使用 Quartz 2D 以编程方式在水龙头上生成了图像。我想将它与中央调度结合使用,这样它就可以在另一个 cpu 上创建,并在完成时触发通常的动画淡入淡出。现在我使用本文底部的以下代码,但我收到这些无效的上下文错误。有没有办法做到这一点还是我运气不好?
CGContextTranslateCTM:无效上下文 0x0 CGContextScaleCTM:无效上下文 0x0 CGContextSaveGState:无效上下文 0x0 CGContextSetCompositeOperation:无效上下文 0x0 CGContextFillRects:无效上下文 0x0 CGContextRestoreGState:无效上下文 0x0 CGContextDrawImage:无效上下文 0x0
我的代码:
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
self.view.contentScaleFactor=[[UIScreen mainScreen] scale];
CGSize sizeofText=[stopName sizeWithFont:[UIFont fontWithName:@"Helvetica-Bold" size:17.5*[self.view contentScaleFactor]]];
CGSize size;
size.width=1024;
size.height=1024;
UIImage *leftCap = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"leftcap@2x" ofType:@"png"]];
UIImage *center = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"center@2x" ofType:@"png"]];
UIImage *rightCap = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"rightcap@2x" ofType:@"png"]];
UIImage *spike = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"spike@2x" ofType:@"png"]];
UIGraphicsBeginImageContextWithOptions(size,false,0);
CGContextRef context = UIGraphicsGetCurrentContext(); //get the context we just made above
CGContextTranslateCTM(context, 0,size.height);
CGContextScaleCTM(context, 1, -1);
width=(19*[self.view contentScaleFactor])+(sizeofText.width)+(43*[self.view contentScaleFactor]);
height=60*[self.view contentScaleFactor];
//draw calls
[leftCap drawInRect:CGRectMake(0,1024- 54.0f*[self.view contentScaleFactor], 19.0f*[self.view contentScaleFactor], 54.0f*[self.view contentScaleFactor])];
[center drawInRect:CGRectMake(19.0f*[self.view contentScaleFactor],1024- 54.0f*[self.view contentScaleFactor],(sizeofText.width), 54.0f*[self.view contentScaleFactor])];
[rightCap drawInRect:CGRectMake((sizeofText.width)+19*[self.view contentScaleFactor],1024- 54.0f*[self.view contentScaleFactor], 43.0f*[self.view contentScaleFactor], 54.0f*[self.view contentScaleFactor])];
[spike drawInRect:CGRectMake((width/2)-((32.0f*[self.view contentScaleFactor])/2.0f),1024-(43.5*[self.view contentScaleFactor])- 27.0f*[self.view contentScaleFactor], 32.0f*[self.view contentScaleFactor], 27.0f*[self.view contentScaleFactor])];
CGContextSelectFont(context, "Helvetica-Bold", 17.5*[self.view contentScaleFactor], kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetTextPosition(context,19.f*[self.view contentScaleFactor],1024- (7.5*[self.view contentScaleFactor])-(sizeofText.height));
CGContextShowText(context, [stopName UTF8String], strlen([stopName UTF8String]));
image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"done. I would trigger the fade in animation ehre");
});
Right now i haven an image being generated on a tap programmatically with Quartz 2D. I wanted to use it in combination with grand central dispatch so it can be created on another cpu and trigger the usual fade in animation when its completed. Right now I use the follow code at the bottom of this post but im getting these invalid context errors. Is there a way to do this or am i out of luck?
CGContextTranslateCTM: invalid context 0x0
CGContextScaleCTM: invalid context 0x0
CGContextSaveGState: invalid context 0x0
CGContextSetCompositeOperation: invalid context 0x0
CGContextFillRects: invalid context 0x0
CGContextRestoreGState: invalid context 0x0
CGContextDrawImage: invalid context 0x0
my code:
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
self.view.contentScaleFactor=[[UIScreen mainScreen] scale];
CGSize sizeofText=[stopName sizeWithFont:[UIFont fontWithName:@"Helvetica-Bold" size:17.5*[self.view contentScaleFactor]]];
CGSize size;
size.width=1024;
size.height=1024;
UIImage *leftCap = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"leftcap@2x" ofType:@"png"]];
UIImage *center = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"center@2x" ofType:@"png"]];
UIImage *rightCap = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"rightcap@2x" ofType:@"png"]];
UIImage *spike = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"spike@2x" ofType:@"png"]];
UIGraphicsBeginImageContextWithOptions(size,false,0);
CGContextRef context = UIGraphicsGetCurrentContext(); //get the context we just made above
CGContextTranslateCTM(context, 0,size.height);
CGContextScaleCTM(context, 1, -1);
width=(19*[self.view contentScaleFactor])+(sizeofText.width)+(43*[self.view contentScaleFactor]);
height=60*[self.view contentScaleFactor];
//draw calls
[leftCap drawInRect:CGRectMake(0,1024- 54.0f*[self.view contentScaleFactor], 19.0f*[self.view contentScaleFactor], 54.0f*[self.view contentScaleFactor])];
[center drawInRect:CGRectMake(19.0f*[self.view contentScaleFactor],1024- 54.0f*[self.view contentScaleFactor],(sizeofText.width), 54.0f*[self.view contentScaleFactor])];
[rightCap drawInRect:CGRectMake((sizeofText.width)+19*[self.view contentScaleFactor],1024- 54.0f*[self.view contentScaleFactor], 43.0f*[self.view contentScaleFactor], 54.0f*[self.view contentScaleFactor])];
[spike drawInRect:CGRectMake((width/2)-((32.0f*[self.view contentScaleFactor])/2.0f),1024-(43.5*[self.view contentScaleFactor])- 27.0f*[self.view contentScaleFactor], 32.0f*[self.view contentScaleFactor], 27.0f*[self.view contentScaleFactor])];
CGContextSelectFont(context, "Helvetica-Bold", 17.5*[self.view contentScaleFactor], kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetTextPosition(context,19.f*[self.view contentScaleFactor],1024- (7.5*[self.view contentScaleFactor])-(sizeofText.height));
CGContextShowText(context, [stopName UTF8String], strlen([stopName UTF8String]));
image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"done. I would trigger the fade in animation ehre");
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我做了类似的事情,只是我使用 CGBitmapContextCreate 代替 UIGraphicsBeginImageContextWithOptions。看起来您的上下文尚未创建 - 可能是因为您正在后台线程上调用 UI* 函数。
I do something similar except I am using CGBitmapContextCreate in place of UIGraphicsBeginImageContextWithOptions. Looks like your context isn't being created - probably because you are calling a UI* function on a background thread.