如何从磁盘上的图像创建CGImageRef

6

我已经四处查找,但没有结果。我正在一个线程中进行一些图像加载,由于UIKit不是线程安全的,因此我将不得不将图像存储为CGImageRefs,但我无法弄清楚如何做到这一点。我以前没有使用过任何Quartz相关的东西,所以它让我感到困惑。基本上,我只需要从磁盘中加载一个JPG文件到CGImageRef中。另外,如果有办法将GIF加载到CGImageRef中,那就更好了。

2个回答

30

gcamp的说法基本正确,你可以放心地在后台线程上使用它,但是为了回答你的问题,我认为以下代码会起作用。

CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename("file");
CGImageRef image = CGImageCreateWithPNGDataProvider(dataProvider, NULL, NO, kCGRenderingIntentDefault);

还有一个用于jpg图片的函数,CGImageCreateWithJPEGDataProvider

(确保在完成操作后释放数据提供程序和图像)


10
我认为最简单的方法是使用UIKit并使用UIImage的CGImage属性。就像这样:
```swift let myImage = UIImage(named: "myImage.png") let cgImage = myImage?.cgImage ```
UIImage* image = [UIImage imageNamed:@"Your Image.png"];
CGImageRef imageRef = image.CGImage;

1
好的,但关键是,这是在线程中发生的,而UIKit不是线程安全的。否则我将只发送UIImage回来。我需要能够从文件中读取图像并直接创建CGImageRef。 - Alexander
很不幸,O.P. 是正确的,苹果公司表示:“所有 UIKit 对象都应该只在主线程上使用。” - Frank Schmitt
如果我没有记错的话,UI更新应该在主线程上完成。UIKit的其他部分实际上是线程安全的。 - gcamp
是的,UI更新应该在主线程上完成,但是我只是从磁盘中加载图像(这是在UI线程上一个昂贵的过程),而且UIImages不是线程安全的,因此CGImageRefs也不是。 - Alexander
实际上,从iOS4开始,UIImages是线程安全的。它们是规则的罕见例外。 - Benjamin Mayo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接