2010-05-07 60 views
10

所以我知道你可以使用UIImage的文件的CGImage ...如何從文件中獲取CGImageRef?

UIImage *img = [UIImage imageNamed:@"name.bmp"]; 
[img CGImage]; 

但是,有沒有辦法讓一個CGImageRef不使用UIImage?我可以使用其他框架,如果有必要,只是不是UIKit。我可以使用其他框架,如果有必要,只是不UIKit。 CIImage會工作嗎?或者NSBitmapImageRep

+0

ImageIO.framework將可用,但除此之外,您不能簡單地通過純CG函數讀取BMP。 – kennytm 2010-05-07 18:54:50

+0

出於好奇,從UIImage加載圖像有什麼危害?是否有顯着的記憶差異? – MrHen 2010-05-07 20:42:32

+0

我正在做單元測試。我們正在編寫的靜態庫需要一個CGImageRef。我想通過從我有的測試文件中傳入一個來測試它。我嘗試在我的單元測試項目中加載UIKit,並且使用UIImage方式,但它從來沒有奏效。我認爲這是因爲我的單元測試項目不是一個視圖應用程序 – 2010-05-07 21:13:27

回答

18

您可以從NSData的得到它:

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((CFDataRef)[NSData dataWithContentsOfFile:@""]); 
CGImageRef image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); // Or JPEGDataProvider 

你必須要肯定的是,數據是JPEG或PNG這個工作。

+0

甜!謝謝!你知道是否有辦法做到這一點的BMP?有沒有CGImageCreateWithBMPDataProvider ... – 2010-05-14 14:42:10

+0

不,對不起,我認爲你將不得不通過UIImage路線爲:( – 2010-05-14 15:21:23

+0

這真的幫了我,但你應該知道,你必須釋放內存, CGImageRef'和下面的'CGImageRelease(image);' – taymless 2014-02-06 16:51:31

1

你必須明白,使用[UIImage imageNamed:@「name.bmp」]通過UIKit框架工作。這不是線程安全的。 dispatch_apply的例子你必須使用Quartz框架。

// Through Quartz 
NSString *maskFilePath = [[NSBundle mainBundle] pathForResource:@"mask" ofType:@"png"]; 
CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([maskFilePath UTF8String]); 
CGImageRef maskRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault);