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ę.

questionAnswers(3)

yourAnswerToTheQuestion