2015-04-23 88 views
1

我正在使用需要個人檔案圖片爲六邊形形狀的Parse的iOS應用程序。現在,我正在從Parse下載PFFile,抓取該圖像,然後用六角形掩蓋。這適用於簡檔視圖,例如個人資料屏幕(屏蔽只需要一次),但是當使用一系列關注者的個人資料圖像屏蔽集合視圖時,該應用會遭受嚴重的性能問題。將UIImage上的蒙版轉換爲NSData時保留蒙版

在我看來,最好的解決方案是將配置文件圖片上傳到已正確屏蔽的Parse,因此我所要做的就是將其拉下並顯示出來。下面是我用來做這在我的註冊視圖控制器代碼:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

[picker dismissViewControllerAnimated:YES completion:nil]; 

UIImage *chosenPicture = info[UIImagePickerControllerEditedImage]; 

[EVNUtility maskImage:chosenPicture withMask:[UIImage imageNamed:@"MaskImage"] withCompletionBlock:^(UIImage *maskedImage) { 

    self.profileImageView.image = maskedImage; 
    self.pictureData = UIImagePNGRepresentation(maskedImage); 

}]; 

} 

拍攝的圖像回到正確地從我的實用功能屏蔽掉,但是當我使用UIImagePNGRepresentation(或JPG等同)的UIImage的轉換數據(這些數據然後上傳到解析),圖像失去其掩碼並再次呈正方形。

如何在將UIImage轉換爲NSData時保留遮罩?

我已經嘗試了幾件事,但我猜這是由於我對如何完成遮罩以及是否影響底層圖像的模糊理解。下面是我用於掩蓋我的形象參考:http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

+0

您的示例代碼存在問題。 'newImage'從哪裏來的?你確定你傳遞正確的圖像到'UIImagePNGRepresentation()'?在你的代碼中,你不是。另外,在你的'EVNUtility'類方法中發生實際屏蔽的事實掩蓋了這個例子。我認爲向我們展示您用來執行遮罩的代碼會更好。否則,任何答案只是一個猜測(並假定你正確掩蓋)。 –

+0

@ToddDitchendorf說,'newImage'是一個錯字和剩餘的代碼,我正在寫代碼來試驗另一個解決方案。我編輯了我原來的問題。 'EVNUtility'中的代碼是從我在問題結尾發佈的鏈接中複製的; 'profileImageView'正確顯示圖像,所以我知道當我將其轉換爲NSData時蒙版已丟失。 – U2Pride15

回答

2

傳中包含您的形象和口罩,這種方法的觀點(我用這個作爲的UIImage的擴展)

+ (UIImage *) imageWithView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return img; 
} 

這將返回你的「 (確保UIView具有清晰的背景)

然後,您將在創建PFFile之前轉換爲PNG(而不是JPG),這將保留透明度。

+0

工程就像一個魅力!在我將UIImage轉換爲NSData時,我在哪裏可以瞭解爲什麼我丟失了蒙版?這對我來說真的不清楚。 – U2Pride15

+0

您的屏蔽UIImage只在運行時被屏蔽 - 即原始圖像位於內存中,但有指令要使用掩碼顯示。我的方法將可見視圖重新抽樣爲新圖像。 – Halpo