2015-11-21 36 views
0

我使用幾個鏈式過濾器生成CIImage,並嘗試在用戶相冊中輸出生成的圖像以用於某些調試目的。我提供給UIImageWriteToSavedPhotosAlbum()的回調總是返回一個零錯誤,所以我認爲沒有任何問題。但圖像從未出現。使用CIImage時,爲什麼UIImageWriteToSavedPhotosAlbum()不工作?

我以前用過這個函數將OpenGL緩衝區轉儲到相冊進行調試,但是我意識到這不是一回事。我應該做一些不同的事情嗎?

-(void)cropAndSaveImage:(CIImage *)inputImage fromFeature:(CIFaceFeature *)feature 
{ 
    // First crop out the face. 
    [_cropFilter setValue:inputImage forKey:@"inputImage"]; 
    [_cropFilter setValue:[CIVector vectorWithCGRect:feature.bounds] forKey:@"inputRectangle"]; 
    CIImage * croppedImage = _cropFilter.outputImage; 
    __block CIImage * outImage = croppedImage; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIImage * outUIImage = [UIImage imageWithCIImage:outImage]; 
     UIImageWriteToSavedPhotosAlbum(outUIImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
    }); 
} 

-(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo 
{ 
    NSLog(@"debug LBP output face. error: %@", error); 
} 

我驗證過的界限從來0

回調輸出總是

debug LBP output face. error: (null)

+0

您需要權限才能訪問照片。 [相機膠捲權限](http://stackoverflow.com/questions/13572220/ask-permission-to-access-camera-roll) – Anticro

+0

沒有,這不是。訪問相機膠捲通常是在我的代碼第一次嘗試訪問它時提示的。我想出了實際的問題。看來我需要實際渲染圖像並直接使用CGImageRef來實例化UIImage。不知道爲什麼這是必要的,也許是在iOS 9中的兼容性錯誤或更改?我見過較舊的帖子,暗示我使用的方法是正確的。請參閱下面的答案。 –

回答

0

我想通了這一點對我自己和刪除的問題,但轉念一想也許有人會從中得到一些用處。我這樣說是因爲我遇到了一個較舊的答案,表明原始實施工作。但實際上必須做到以下幾點才能正常工作。

 __block CIImage * outImage = _lbpFilter.outputImage; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    CGImageRef imgRef = [self renderCIImage:outImage]; 
    UIImage * uiImage = [UIImage imageWithCGImage:imgRef]; 

    UIImageWriteToSavedPhotosAlbum(uiImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
}); 

+ (CGImageRef)renderCIImage:(CIImage *)img 
{ 
    if (!m_ctx) { 
     NSDictionary * options = @{kCIContextOutputColorSpace:[NSNull null], kCIContextWorkingColorSpace:[NSNull null]}; 
     m_ctx = [CIContext contextWithOptions:options]; 
    } 

    return [m_ctx createCGImage:img fromRect:img.extent]; 
} 
+0

我不明白爲什麼這整個事情不是重複的,比如說:http://stackoverflow.com/questions/15878060/setting-uiimageview-content-mode-after-applying-a-cifilter或這個: http://stackoverflow.com/questions/30558516/image-rotating-after-cifilter和許多其他人。 「imageWithCIImage」並不支持位圖支持的UIImage這一事實在這裏被重複了很多次。我的意思並不是要減輕你自己解決問題的能力,但我認爲這只是一個重複。 – matt

+0

我現在看到這個答案碰巧出現在另一個問題中,儘管我不同意它是一個特定副本。我是這個領域的新手,對於給定對象在寫入輸出設備時不會隱式處理渲染的API(恰好是文件系統而不是顯示器),它看起來不太合適。 。我認爲這是一個容易在UIImageWriteToSavedPhotosAlbum和UIImage的細微差別。它有能力渲染它,沒有理由不會。所以除非有確切的問題,否則我必須不同意你的看法。 –

+0

好的,我願意將它作爲副本取消標記。我對API也沒有任何爭論,這有點誤導。不過,我也是對的:你需要知道的一般事實,即CIImage支持的UIImage與位圖支持的UIImage不同,並且你不能神奇地將一種類型視爲另一種類型,這很好記錄在Stack Overflow上,甚至如果你仔細想想,可以在Apple的文檔中找到。 – matt