Tag: 核心graphics

使用核心graphics绘制减法文本的path

在Core Graphics中创build填充path是非常简单的,正如创build填充文本一样。 但是我还没有find填充path的例子,除了子path中的文本。 我的文字绘图模式,裁剪等实验让我无处可去。 这里有一个例子(在Photoshop中创build)。 你将如何去创build核心graphics的前景形状? 我会提到这种技术似乎在即将到来的主要移动操作系统版本中被大量使用,但是我不想和SO的NDA警察发生冲突;)

内存警告和崩溃(ARC) – 如何确定它发生的原因?

我最近开始使用ARC,从那以后我就把它归咎于每一个内存问题。 :)也许,你可以帮助我更好地理解我做错了什么。 我目前的项目是关于CoreGraphics很多 – 图表绘图,充满缩略图的视图等等。 我相信在使用手动内存pipe理时,除了几个僵尸之外,没有任何问题。但是到目前为止,应用程序每次尝试创build大量缩略图或重绘一些更复杂的图表时都会崩溃。 在使用仪器进行分析时,我可以看到驻留记忆以及肮脏记忆的非常高的价值。 堆分析显示相当惊人的不规则增长… 在绘制一些缩略图时,驻留内存会增长大约200 MB。 当绘制所有内容时,内存的回落几乎与绘制前相同。 但是,有了许多缩略图,常驻内存中的值高于400 MB ,显然会使应用程序崩溃。 我试图限制在同一时间绘制缩略图(NSOperationQueue和它的maxConcurrentOperationCount),但释放这么多的内存似乎需要多一点时间,它并没有真正解决这个问题。 现在,我的应用程序基本上不工作,因为真正的数据与许多复杂的图表=很多缩略图。 每个缩略图都是用我从这里得到的代码创build的:( UIImage上的类别) + (void)beginImageContextWithSize:(CGSize)size { if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { if ([[UIScreen mainScreen] scale] == 2.0) { UIGraphicsBeginImageContextWithOptions(size, YES, 2.0); } else { UIGraphicsBeginImageContext(size); } } else { UIGraphicsBeginImageContext(size); } } + (void)endImageContext { UIGraphicsEndImageContext(); } + (UIImage*)imageFromView:(UIView*)view { […]

重复之前CAKeyframeAnimation延迟

我有一个CAKeyframeAnimationanimation,我想重复使用repeatCount = HUGE_VALF永远。 animation的持续时间是2秒,但是我想在每个循环之前暂停3秒。 我能想到的唯一两种方法是: 使整个animation持续5秒钟,并添加额外的keyTimes和值,以便在5sanimation的最后3秒期间获得暂停。 这感觉有点哈克。 有animation只重复一次,然后添加使用像performSelector:afterDelay:2再次运行animation,等等。 这感觉也很脏。 也意味着我需要调用addAnimation:每5秒钟,我不知道是最佳的性能。 我还有其他的select吗? 这两种方法之一是否比其他方法好?

如何直接更新像素 – 使用CGImage和直接CGDataProvider

实际问题 几个答案将解决我的问题: 我可以像CGContextDrawImage一样强制CGImage从直接数据提供者(使用CGDataProviderCreateDirect创build)重新加载它的数据吗? 或者有其他的方法可以设置self.layer.contents来做到这一点? 是否有一个CGContextconfiguration,或者我可以使用CGContextDrawImage一致呈现1024×768图像至less30 fps的技巧。 有没有人能够成功地使用CVOpenGLESTextureCacheCreateTextureFromImage实时缓冲区更新与他们自己的纹理数据? 我认为我最大的问题是创build一个CVImageBuffer因为我从Apples的纹理文档复制了其他属性。 如果任何人有更多的信息,这将是很棒的。 任何其他的指导方针,我怎么可以从内存中获取图像在30 fps的屏幕上。 背景(批次): 我正在做一个项目,我需要实时修改NPOT图像数据的像素(最低30帧/秒),并在iOS屏幕上绘制。 我的第一个想法是使用OpenGL与glTexSubimage2D进行更新,不幸的是,结果是非常慢(在iPad上6 fps),因为驱动程序将每帧的RGB数据转换为BGR。 所以发送它在BGR你说,我也是这样,但由于某种原因,你不能用GL_BGR去调用GL_BGR去图。 我知道一些缓慢是因为它是不是2图像数据的力量,但我的要求规定。 更多的阅读导致我CVOpenGLESTextureCacheCreateTextureFromImage但所有的例子是它使用直接相机input获取CVImageBufferRef我试图使用文档(没有官方,但只是头注释),使我自己的CVImageBuffer形成我的图像数据,但它不会使用这个(在debugging器中没有错误只是一个空的纹理),这使得我认为苹果公司专门build立了这个处理实时相机数据,除了IDK之外,还没有经过多lesstesting。 无论如何,放弃我的尊严,通过倾倒OpenGL,并将我的想法转换到CoreGraphics我被引导到这个问题最快的方式来绘制iPhone上的屏幕缓冲区 ,build议使用CGImage支持的CGDataProviderCreateDirect ,它允许您返回一个指向图像数据当CGImage需要它时,真棒吧? 那么它似乎不像广告一样。 如果我使用CGContextDrawImage那么一切正常。 我可以修改像素缓冲区,每一个绘图,它会像我们的数据提供程序那样请求图像数据,调用CGDataProviderDirectCallbacks的方法( Note:它们似乎有一个内置优化,如果它具有相同的地址如前所述)。 CGContextDrawImage是不是超快(约18 fps),即使禁用插值,从6 fps起。 苹果的文档告诉我使用self.layer.contents将比CGContextDrawImage快得多。 使用self.layer.contents适用于第一个作业,但CGImage从不要求像CGContextDrawImage那样从数据提供程序重新加载,即使在我调用[layer setNeedsDisplay] 。 在我引用的SO问题中,用户通过每一帧从数据源创build和销毁新的CGImage来解决这个问题,这是一个毫无希望的缓慢过程(是的,我尝试过了),所以真正的问题是时间了。 注意 :我已经剖析了所有这些操作,并且知道问题确实是OpenGL的glTexSubImage ,而CGContextDrawImage实际上是CoreGraphics的问题,所以没有“go profile”的回答。 演示这种技术的编辑源代码现在可以在http://github.com/narpas/image-sequence-streamingfind

绘制一个移动的正弦波反锯齿

我想以一种清晰的反锯齿方式绘制一个变化频率和变化幅度的移动正弦波。 这怎么可能?

在UIView中绘制三angular形切口以供select指示

我正在创build一个视图,作为我的应用程序的类别select器。 我希望它有一个三angular形作为select指示,如在这个图像: 我不确定如何绘制三angular形,使其成为镂空,揭示下面的主要视图。 下面的主视图很可能有一个自定义的,可能不重复的(我还没有决定)图像作为其背景。 另外,当select改变时,我希望三angular形animation到一个新的位置,这使得事情进一步复杂化。 我意识到子视图会使animation更容易,但会使绘图复杂化; 直接绘制可能会使animation更难一点。 而且我对Quartz不太熟悉,所以我不确定如何去直接绘制路线。 提前致谢! 更新:我已经看过马特·加拉格尔(Matt Gallagher)在绘制带有孔的graphics上的post,但是它并没有真正回答我的问题。 有没有办法让我“看”在我的形状内的特定path下面的东西,并复制它? …然后支持animation呢? 更新2:我通过简单地绘制一个额外的path完成了部分工作。 结果如下所示: http : //dl.dropbox.com/u/7828009/Category%20Selector.mov 代码: CGRect cellRect = [self rectForCategoryNumber:(selectedCategoryIndex + 1)]; [[UIColor scrollViewTexturedBackgroundColor] setFill]; CGContextMoveToPoint(currentContext, self.frame.size.width, (cellRect.origin.y + cellRect.size.height * 0.15)); CGContextAddLineToPoint(currentContext, self.frame.size.width, (cellRect.origin.y + cellRect.size.height * 0.65)); CGContextAddLineToPoint(currentContext, self.frame.size.width * 0.8, (cellRect.origin.y + cellRect.size.height * 0.4)); CGContextClosePath(currentContext); CGContextFillPath(currentContext); [[UIColor […]

如何将UIImage / CGImageRef的alpha通道转换为掩码?

我怎样才能提取UIImage或CGImageRef的alpha通道,并将其转换成我可以使用CGImageMaskCreate的掩码? 例如: 基本上,给任何图像,我不关心图像内的颜色。 我想要的只是创build一个代表alpha通道的灰度图像。 这个图像可以用来掩盖其他图像。 当你提供一个图标图像的时候,这个UIBarButtonItem的一个例子是。 根据苹果文件,它指出: 显示在栏上的图像来源于该图像。 如果这张图片太大而无法放在栏上,则会缩放。 通常,工具栏和导航栏图像的大小是20 x 20点。 源图像中的alpha值用于创build图像 – 不透明值将被忽略。 该UIBarButtonItem采取任何图像,只看阿尔法,而不是图像的颜色。

在CGContext上绘制部分透明的图像

我在前台和透明背景中有一个黄色花瓶的图像: 我正在CGContext上绘制它: CGContextDrawImage(context, CGRectMake(0, 0, 100, 100), myImage.CGImage); 我可以在CGContextDrawImage之前使用下面的语句在它周围画一个阴影: CGContextSetShadowWithColor(context, CGSizeMake(0,0), 5, [UIColor blueColor].CGColor); 但是我想在图片上放一下,所以它看起来像下面这样: 如果我这样做: CGContextSetRGBStrokeColor(shadowContext, 0.0f, 0.0f, 1.0f, 1.0f); CGContextSetLineWidth(shadowContext, 5); CGContextStrokeRect(shadowContext, CGRectMake(0, 0, 100, 100)); 它(显然)在整个图像周围绘制一个矩形边框,如下所示: 这不是我所需要的。 但是,在第三个图像中绘制边界的最好方法是什么? 请注意,在这种情况下不可能使用UIImageView,所以使用UIImageView的CALayer属性是不适用的。

(Scale)在一个点放大到一个UIView

一些我不了解转换的东西。 我想放大说一个UIView(主视图)的右上angular。 我使用CGAffineTransformScale并试图设置中心/ anchorPoint以及CGAffineTransformMakeTranslation无济于事。 我无法弄清楚如何正确设置翻译,以便放大这一点。 CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2); [UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ self.view.transform = tr; self.view.center = CGPointMake(480,0); } completion:^(BOOL finished) {}];

UIView透明渐变

鉴于iOS上的任意UIView,有没有一种方法使用核心graphics(CAGradientLayer想到)应用“前景透明”的梯度呢? 我不能使用标准的CAGradientLayer,因为背景比UIColor更复杂。 我也不能叠加一个PNG,因为当我的子视图沿着它的父级垂直滚动视图(见图)滚动时,背景将会改变。 我有一个非优雅的回退:有我的uiview剪辑其子视图,并随着父滚动视图滚动而移动背景的预先呈现的渐变png。