UIImage do surowego NSData / unikaj kompresji
Mam własną klasę pobierania obrazów, przechowuje kolejkę i pobiera obrazy jeden (lub pewną ilość) naraz, zapisuje je do folderu pamięci podręcznej i pobiera je z folderu pamięci podręcznej, gdy jest to konieczne. Mam także podklasę UIImageView, do której mogę przekazać adres URL, poprzez klasę pobierania obrazów będzie wyglądać, jeśli obraz już istnieje na urządzeniu i pokazać go, jeśli tak, lub pobrać i pokazać go po zakończeniu.
Po zakończeniu pobierania obrazu wykonuję następujące czynności. Tworzę UIImage z pobranych NSData, zapisuję pobrane NSData na dysk i zwracam UIImage.
// This is executed in a background thread
downloadedImage = [UIImage imageWithData:downloadedData];
BOOL saved = [fileManager createFileAtPath:filePath contents:downloadedData attributes:attributes];
// Send downloadedImage to the main thread and do something with it
Aby pobrać istniejący obraz, robię to.
// This is executed in a background thread
if ([fileManager fileExistsAtPath:filePath])
{
NSData* imageData = [fileManager contentsAtPath:filePath];
retrievedImage = [UIImage imageWithData:imageData];
// Send retrievedImage to the main thread and do something with it
}
Jak widać, zawsze tworzę UIImage bezpośrednio z pobranych NSData, nigdy nie tworzę NSData za pomocą UIImagePNGRepresentation, aby obraz nigdy nie został skompresowany. Kiedy utworzysz UIImage ze skompresowanego NSData, UIImage rozpakuje go tuż przed renderowaniem w głównym wątku i tym samym zablokuje interfejs użytkownika. Ponieważ mam teraz UITableView z mnóstwem małych obrazów, które muszą zostać pobrane lub pobrane z dysku, byłoby to niedopuszczalne, ponieważ ogromnie spowolniłoby to moje przewijanie.
Teraz mój problem. Użytkownik może również wybrać zdjęcie z rolki aparatu, zapisać je, a także musi pojawić się w moim UITableView. Ale nie mogę znaleźć sposobu, aby zamienić UIImage z rolki kamery w NSData bez użycia UIImagePNGRepresentation. Oto moje pytanie.
Jak mogę przekonwertować UIImage na nieskompresowane NSData, aby później przekonwertować go z powrotem na UIImage przy użyciu imageWithData, aby nie musiał być dekompresowany przed renderowaniem?
lub
Czy jest jakiś sposób, aby wykonać dekompresję przed wysłaniem UIImage do głównego wątku i buforować go, tak że trzeba go tylko raz zdekompresować?
Z góry dziękuję.