Używam ALAsset do pobierania obrazów tak:Jak szybko zapisać plik ALAsset na dysku na iOS?
[[asset defaultRepresentation] fullResolutionImage]]
Ten powrót CGImageRef który chcę zapisać na dysk tak szybko, jak to możliwe ...
Rozwiązanie 1:
UIImage *currentImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
NSData *currentImageData = UIImagePNGRepresentation(currentImage);
[currentImageData writeToFile:filePath atomically:YES];
Rozwiązanie 2:
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
CGImageDestinationAddImage(destination, [[asset defaultRepresentation] fullResolutionImage], nil);
CGImageDestinationFinalize(destination);
Problem polega na tym, że obie metody są bardzo powolne wykonywanie na urządzeniu. Wykonanie tego zajmuje około 2 sekund na obraz. I to absolutnie za długo.
Pytanie: Jak mogę przyspieszyć proces zapisywania obrazu? A może jest lepsze rozwiązanie tego?
AKTUALIZACJA: Najlepsze ulepszenia wydajności w obu rozwiązaniach to zapisywanie obrazów w formacie JPEG zamiast w formacie PNG. Tak więc dla rozwiązania 1 zastąpiono UIImagePNGRepresentation
z UIImageJPEGRepresentation
. Dla rozwiązania 2 wymieniono kUTTypePNG
na kUTTypeJPEG
.
Warto również zauważyć, że drugie rozwiązanie jest o wiele wydajniejsze pod względem pamięci niż pierwsze.
Rozumiem. Ale czy istnieje inny, bardziej skuteczny sposób na zrobienie tego? Nie potrzebuję PNG. Właściwie każdy format jest w porządku. Po prostu muszę skopiować oryginalny obraz z ALAsset do mojego folderu niestandardowego ...? Dziękujemy –
Czy wypróbowałeś UIImageJPEGRepresentation? –
Po prostu próbowałem z reprezentacją JPEG - jest o połowę szybszy niż reprezentacja PNG (nadal około 1 sekundy). To jest dużo lepsze. Ale wciąż nie to, czego się spodziewałem. Czy jest coś jeszcze? A co z różnicą między obydwoma rozwiązaniami, o których pisałem. Ma jakąkolwiek przewagę nad drugą? –