问题标签 [cgcontextdrawimage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
18 回答
122375 浏览

ios - CGContextDrawImage 在传递 UIImage.CGImage 时将图像倒置

有谁知道为什么CGContextDrawImage要把我的形象颠倒过来?我正在从我的应用程序中加载图像:

然后简单地要求核心图形将其绘制到我的上下文中:

它呈现在正确的位置和尺寸,但图像是颠倒的。我必须在这里遗漏一些非常明显的东西?

0 投票
1 回答
1033 浏览

calayer - 模拟器上的图层 OK 中的 Alpha 检测,而不是 iPhone

首先,从 SO 的其他地方查看这个非常方便的CALayer扩展。它可以帮助您确定图层内容分配的CGImageRef中的点是否中的某个点是否透明。

注意:不能保证图层contents可以表示或响应,就好像它是CGImageRef 一样。(这可能对更广泛地使用上面提到的扩展产生影响,授予。)但是,在我的情况下,我知道我正在测试的层contents被分配了一个CGImageRef。(希望这不会在我分配后改变!另外我注意到它contents被保留了。)

好的,回到手头的问题。这是我使用扩展的方式。对于初学者,我已将选择器从更改containsPoint:containsNonTransparentPoint:(我需要保留原始方法。)

现在,我有一个使用七个CALayer对象的UIImageView子类。这些用于基于不透明度的动画(脉冲/发光效果和开/关状态)。这七层中的每一层都有一个已知的CGImageRef,它有效地“覆盖”(空中引号)整个视图的一部分,并带有自己的颜色。其各自图层中的每个图像的其余部分都是透明的。contents

在子类中,我注册了单击手势。当一个到达时,我遍历我的层以查看哪个被有效地点击(也就是说,哪个有一个我点击的不透明点,第一个找到获胜)然后我可以做任何需要做的事情。

这是我处理手势的方式:

好消息?所有这些都可以在 iOS 4.3.2 的 iPhone 模拟器上完美运行。(FWIW,我在 Lion 上运行 Xcode 4.1。)

然而,在我的 iPhone 4(使用 iOS 4.3.3)上,它甚至没有接近!我的水龙头似乎都没有与我期望它们匹配的任何层相匹配。

即使我尝试使用CGContextSetBlendMode的建议在绘制 1x1 像素上下文时

我希望这是飞行员的错误,但我还没有弄清楚差异是什么。水龙头确实有图案,但不是可辨别的。

也许存在数据边界问题。也许除了将 y 坐标翻转到图像的左下角之外,我还需要做一些事情。只是还不确定。

如果有人可以请阐明可能有什么问题,我将不胜感激!

2011 年 9 月 22 日更新:获得第一个啊哈时刻!问题不在于 Simulator-vs-iPhone。这是视网膜与非视网膜!使用 Retina 版本时,模拟器中也会出现相同的症状。也许解决方案以某种方式/形状/形式围绕缩放(CTM?)。Quartz 2D Programming Guide 还建议“iOS 应用程序应该使用UIGraphicsBeginImageContextWithOptions ”。我觉得我非常接近这里的解决方案!

0 投票
2 回答
15096 浏览

ios - 将大 UIImage 绘制到其中后,CGContextDrawImage 非常慢

似乎 CGContextDrawImage(CGContextRef, CGRect, CGImageRef) 在绘制由 CoreGraphics(即使用 CGBitmapContextCreateImage)创建的 CGImage 时比在绘制支持 UIImage 的 CGImage 时执行的要差得多。看这个测试方法:

所以我想问题是,#1 可能是什么原因造成的,#2 有没有办法解决它,即创建 CGImageRef 可能更快的其他方法?我意识到我可以先将所有内容都转换为 UIImages,但这是一个丑陋的解决方案。我已经有 CGContextRef 坐在那里。

更新:绘制小图像时,这似乎不一定是真的?这可能是一个线索——当使用大图像(即全尺寸相机照片)时,这个问题会被放大。640x480 在执行时间方面似乎与任何一种方法都非常相似

更新 2:好的,所以我发现了一些新的东西。它实际上不是改变性能的 CGImage 的支持。我可以翻转 2 个步骤的顺序,使 UIImage 方法运行缓慢,而“裸”CGImage 会非常快。似乎无论你第二次表演,都会遭受糟糕的表现。除非我通过在使用 CGBitmapContextCreateImage 创建的图像上调用 CGImageRelease 来释放内存,否则似乎就是这种情况。然后 UIImage 支持的方法随后会很快。反之则不成立。是什么赋予了?“拥挤”的内存不应该像这样影响性能,不是吗?

更新3:说得太早了。之前的更新适用于尺寸为 2048x2048 的图像,但升级到 1936x2592(相机尺寸)时,裸 CGImage 方法仍然慢得多,无论操作顺序或内存情况如何。也许有一些 CG 内部限制使 16MB 图像高效,而 21MB 图像无法有效处理。绘制相机尺寸比 2048x2048 慢 20 倍。不知何故,UIImage 提供它的 CGImage 数据比纯 CGImage 对象快得多。oO

更新 4:我认为这可能与一些内存缓存有关,但是无论 UIImage 是否加载了非缓存 [UIImage imageWithContentsOfFile],结果都是相同的,就像使用 [UIImage imageNamed] 一样。

更新 5(第 2 天):在创建了比昨天回答的问题之后,我今天有了一些扎实的东西。我可以肯定地说的是:

  • UIImage 后面的 CGImages 不使用 alpha。(kCGImageAlphaNoneSkipLast)。我认为也许它们绘制得更快,因为我的上下文使用的是 alpha。所以我更改了上下文以使用 kCGImageAlphaNoneSkipLast。这使得绘图速度更快,除非:
  • 使用 UIImage FIRST 绘制到 CGContextRef 中,使所有后续图像绘制速度变慢

我通过 1) 首先创建一个非 alpha 上下文 (1936x2592) 证明了这一点。2) 用随机颜色的 2x2 方块填充它。3) 将 CGImage 绘制到该上下文中的全帧速度很快(0.17 秒) 4) 重复实验,但使用支持 UIImage 的绘制 CGImage 填充上下文。随后的全帧图像绘制时间超过 6 秒。慢速万维网。

不知何故,使用(大)UIImage 绘制到上下文中会大大减慢所有后续绘制到该上下文中的速度。

0 投票
1 回答
623 浏览

ios - CGContext陌生感

我有一个小代码模块,应该称为签名面板,以便用户可以用手指在此面板上签名。整个过程在 iPad 上运行。现在,我设法完成了通常的 touchesBegan()、touchesMoved()、touchesEnded() 轮播,让他在那个面板上签名。签名时,我在主视图上画了他的签名。然而,由于某种原因,图像出现了两次:一次正确,一次倒置在主要签名上方(见图)。由于我没有在我的代码中看到任何翻译,我怀疑整个代码可能不正确,但我不知道为什么。有谁知道我在这里做错了什么?

在此处输入图像描述

0 投票
1 回答
532 浏览

iphone - 如何在iphone(CGGraphics)中擦除线条?

我正在开发一个绘图的 iPhone 应用程序,用户可以画一条线,也可以删除,所以任何人都可以帮助我如何删除线或绘图吗?

绘制代码

0 投票
1 回答
288 浏览

core-graphics - 手写时如何为线条创建曲线

我正在创建一个应用程序,并且在一方面,我正在尝试实现手写。我使用了一个 imageView 来写,它将被保存并作为 pdf 发送到服务器。我已经实现了触摸开始、移动和结束,并且使用 contextAddLineToPoint,我可以在用户编写内容时创建线条。然而。文字有点尖锐,当用户改变书写方向时,我试图创建曲线,即当写一封信时。我并不是真的想实现手写识别,而只是为了平滑绘制的线条。

我创建了一个“缓冲区”,由一个数组组成,当用户移动触摸时,它保存两个中间点。如下:

drawImage 是我用来在 btw 上写的 imageView。然后去触摸感动:

}

如您所见,每次存储两个点时,我都会在它们之间画一条线。这使得绘图稍微困难,线条更加参差不齐。

任何人都可以帮助解决这个问题,我对 iOS 中的图形非常陌生,不确定我是否使用了正确的 API,以及是否应该使用 imageView。

非常感谢提前

0 投票
1 回答
575 浏览

objective-c - 如何为视网膜显示绘制带有插值的 UIImage?

我在我的应用程序中从网络加载一些图像并使用 UIImage drawImage 绘制它们。我想继续为视网膜显示使用相同的图像,但通过插值平滑它们。我们怎样才能做到这一点?

我想我可以提前以双倍分辨率保存(在内存中)或在渲染时缩放。这取决于它在渲染期间对性能的影响程度。

0 投票
1 回答
520 浏览

iphone - CGContextClip 之后的 UIImage drawAtPoint

我使用 ABUITableViewCell 并手动绘制所有内容。此外,我使用 CGContextClip 制作圆角,一切都很好,但是当我尝试在剪辑 rect 之外绘制另一个图像时,它没有显示出来。

当我绘制 NSString 时,我使用 CGContextSaveGState(context) 函数并显示文本。但图像不是。

如何在 CGContextClip 之后绘制图像?

0 投票
1 回答
1246 浏览

ios - iOS - 是否可以缓存 CGContextDrawImage?

我使用时序分析工具确定 95% 的时间都花在调用函数 CGContextDrawImage 上。

在我的应用程序中,有很多重复的图像被重复地从精灵地图中截取并绘制到屏幕上。我想知道是否可以在 NSMutableDictionay 中缓存 CGContextDrawImage 的输出,然后如果再次请求相同的精灵,它可以从缓存中拉出它,而不是做所有的剪辑和渲染工作。这就是我所拥有的,但我还没有成功:

定义

添加到缓存

渲染缓存的精灵 可能有更好的方法来渲染 CGImage,这是我的最终缓存目标,但目前我只是想成功地渲染缓存的图像,但这并没有成功。

0 投票
0 回答
1027 浏览

ios - 使用变换从 UIImageView 中提取图像

我写了一个基于多点触控的照片调整程序。UIImageView 显示照片时,根据用户触摸设置变换值,以扩大/缩小图像。这是一些处理多点触控的代码。

因此,程序会保留原始照片并更改变换值以显示调整。最后,我得到了原始图像和变换值作为结果。至于使用 UIImageView,我可以通过将 .image 设置为原始照片并将 .transform 设置为调整的结果来重现调整后的图像。现在,要将调整后的图像重绘为单个图像,我尝试使用 CGContextConcatCTM 将变换应用于绘图图像。

然后我得到了一个错误的图像,大多数情况下结果与我预期的图像不同。(我可以使用 UIImageView 与变换得到什么)我搜索了这个套件和其他套件,并找到了一些旋转解决方案,但是对于任何类型的变换都没有通用解决方案。有些机制仅适用于旋转,有些适用于扩展等。似乎 UIImageView 变换和 CGContextConcatCTM 之间的轴差异导致了问题。但我找不到任何相关信息。逻辑上 Core graphics 和 UIView origin 应该是相同的。

谁能告诉我什么是通用解决方案?