2013-04-16 12 views
11

Chcę zezwolić użytkownikowi na wybranie zdjęcia bez ograniczania rozmiaru, a następnie jego edycję.Obsługa dużych obrazów w iOS

Mój pomysł polega na utworzeniu miniatury dużego zdjęcia o tym samym rozmiarze co ekran do edycji, a następnie, po zakończeniu edycji, użyj dużego zdjęcia, aby wykonać tę samą edycję, która została wykonana na miniaturze.

Gdy używam UIGraphicsBeginImageContext do utworzenia miniatury obrazu, spowoduje to problem z pamięcią.

Wiem, że trudno jest edytować cały duży obraz bezpośrednio ze względu na ograniczenia sprzętowe, więc chcę wiedzieć, czy jest sposób, w jaki mogę zmniejszyć rozmiar dużego obrazu do mniej niż 2048 * 2048 w przypadku problemów z pamięcią?

Znalazłem klasę BitmapFactory, która ma opcję inSampleSize, która może zmniejszyć zdjęcie w platformie Android. Jak to zrobić w systemie iOS?

+0

Możesz użyć NSData * data = [NSData dataWithContentsOfFile: opcje ścieżki: NSDataReadingMappedAlways error: & error]; Aby uzyskać dostęp do danych obrazu bez wczytywania go do pamięci. – Sten

+0

dzięki za podpowiedź Stena, próbowałem używać opcji NSDataReadingMappedAlways, ale nadal ulega awarii z obrazem 10000 * 10000, myślę, że nie ważne jak załadować obraz, użyć UIGraphicsBeginImageContext do skalowania obrazu początkowego potrzebuje całej bitmapy w pamięci. Czy jest jakiś sposób, aby zmniejszyć obraz po załadowaniu pliku jpeg/png do pamięci? – lingtianlan

Odpowiedz

8

trzeba obsłużyć ładowanie obrazu przy użyciu UIImage które w rzeczywistości nie załadować obraz do pamięci, a następnie utworzyć kontekstu bitmapy na wielkość wynikowego obrazu, który chcesz (tak będzie to ilość wykorzystanej pamięci). Następnie musisz powtórzyć kilka razy rysowanie kafelków z oryginalnego obrazu (tutaj wczytywane są części danych obrazu do pamięci) przy użyciu CGImageCreateWithImageInRect w kontekście docelowym przy użyciu CGContextDrawImage.

Zobacz this sample code from Apple.

+0

Doskonałe, nie może uzyskać więcej autorytatywny niż przykład kodu z Apple, który jest dokładnie o tym temacie! – DarkDust

0

Proszę spojrzeć na tę pracę autorstwa Trevora Harmona. Poprawiło to wydajność mojej aplikacji. Wierzę, że będzie działać również dla Ciebie.

https://github.com/coryalder/UIImage_Resize

+0

Ponieważ działa na pamięci UII, która już działa w pamięci, jak można uniknąć problemów z pamięcią? – DarkDust

1

Duże obrazy nie mieszczą się w pamięci. Tak więc załadowanie ich do pamięci, aby następnie zmienić ich rozmiar, nie działa.

Do pracy z bardzo dużymi obrazami należy je układać. Wiele rozwiązań tam już na przykład sprawdzić, czy można rozwiązać ten problem:

https://github.com/dhoerl/PhotoScrollerNetwork

I wdrożone moje własne niestandardowe rozwiązania, ale to było charakterystyczne dla naszego środowiska, w którym mieliśmy już & I to po stronie serwera z systemem obraz dekarz może po prostu poprosić o konkretne kafelki dużych obrazów (serwer madea, jest naprawdę fajny)

Powodem, dla którego kafelkowanie działa, jest to, że w zasadzie tylko widoczne piksele pozostają w pamięci, a nie ma ich zbyt wiele. Wszystkie kafelki, które nie są obecnie widoczne, są uwzględniane w pamięci podręcznej dysku lub w pamięci podręcznej pamięci flash.

Powiązane problemy