2013-01-24 60 views
1

我正在處理大量大圖像的卡魯塞爾,並且正在進行一些測試以嘗試提高加載圖像的性能。現在,即使我已經在不同的隊列上解壓jpg,它仍然會花費一點點,主要是與iOS中包含的相冊應用程序進行比較。此外,如果我非常快速地傳遞圖像,我可以產生記憶警告。我可以在覈心數據中存儲解壓縮的圖像

所以我想要做的是將CGImageRef(或UIImage已解壓:原始數據)存儲到核心數據。但我發現的所有答案和選項都使用UIImageJPegRepresentation,但這樣做會再次壓縮圖像,不是嗎?

有人知道有沒有辦法?我是否錯誤地關注了問題?

+0

第二個答案[here ](http://stackoverflow.com/questions/6073259/getting-rgb-pixel-data-from-cgimage)討論如何將圖像作爲NSData獲取,您可以使用Core Data存儲圖像。 – Brendon

回答

0

是的,你可以將圖像轉換爲NSData並存儲它。例如:

Entity *testEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:__managedObjectContext]; 
NSString *photoPath = [[NSBundle mainBundle] pathForResource:@"photo" ofType:@"png"]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:photoPath]) { 
    NSData *data = [NSData dataWithContentsOfFile:photoPath]; 
    [testEntity setPhoto:data]; 
} 

這將圖像作爲BLOB數據存儲在sqlite文件中。

+0

但是,這將是一個壓縮的圖像已經不會是?一旦我想將它用作UIImage,該BLOB中包含的jpg將不得不通過解壓縮過程。我錯了嗎? – crisisGriega

0

理想情況下,你永遠不會在內存中保存大量的UIImage對象的大圖像。他們會給你u內存警告。 如果圖像是本地文件,則可以使用後臺線程將大圖像縮放爲旋轉木馬的理想大小。您可以保存這些縮略圖並將它們映射到原始圖像。 加載旋轉木馬的拇指指甲,並使用原始圖像文件查看詳細的圖像。拇指指甲爲png以獲得最佳性能.Jpeg解碼不是iOS的本機,並且需要更多的cpu來解碼它們,而不是png.You dont必須保持在覈心數據的拇指指甲數據,.png文件會做我experience.You了很好的工作可以用下面的代碼加載圖像

UIImage * image = [UIImage imageWithContentsOfFile:filePath]; 

這裏是調整圖像

代碼
- (UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize { 
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
CGImageRef imageRef = image.CGImage; 

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

// Set the quality level to use when rescaling 
CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height); 

CGContextConcatCTM(context, flipVertical); 
// Draw into the context; this scales the image 
CGContextDrawImage(context, newRect, imageRef); 

// Get the resized image from the context and a UIImage 
CGImageRef newImageRef = CGBitmapContextCreateImage(context); 
UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

CGImageRelease(newImageRef); 
UIGraphicsEndImageContext(); 

return newImage; 

}

+0

我沒有使用縮略圖。基本上它只是一個滾動視圖。我在背景「線程」中加載圖像,但當滾動速度太快時,我可以處理以前的線程,因此出現內存警告 – crisisGriega

+0

您可以放置​​佔位符圖像,然後嘗試在運行時縮放大圖像使用塊,這將使您的內存需求低,但用戶界面響應 –

+0

感謝您的答案。我想我會上傳一些代碼(當我有機會的時候),以便更好地描述這些問題。 – crisisGriega