2012-07-25 18 views
9

Mam duży obraz, który jest zbyt duży, aby można go było załadować do pamięci, ale interesuje mnie tylko pod zestaw pikseli w tym dużym obrazie. Czy można dekodować w pamięci tylko ten podzbiór pikseli? Wiem, że w Androidzie istnieje klasa w API, aby zrobić dokładnie to nazywa BitmapRegionDecoder to coś takiegoios Odkodować część obrazu

znalazłem CGDataProviderCreateSequential ale wymaga surowych pikseli w konstruktorze ...

Teraz robię coś takiego:

UIImage* srcImage = ...; 
    CFDataRef cgImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(srcImage.CGImage));//After this call, all pixels are decoded into memory and the app crashes 
char* imageData = (char*)CFDataGetBytePtr(cgImgDataRef); 
+0

Obecna mądrość mówi, że sposobem na to jest podzielenie obrazu na płytki i leniwe załadowanie tylko płytek aktualnie wyświetlanych na odpowiednim poziomie powiększenia. Dokładnie jak duży jest ten obraz (w wymiarach w pikselach)? – warrenm

+0

około 4096 x 3072, ale chodzi o to, że chcę załadować kafelek dużego obrazu bezpośrednio do mojej otwartej aplikacji ES. Więc muszę wyodrębnić potrzebne piksele i zadzwonić do glTexImage2D (...) z subpikselowymi danymi – AkademiksQc

+0

Czy rozmiar wyodrębnionego obrazu dolnego jest zawsze taki sam, czy zmienia się? Jaki jest zasięg? – warrenm

Odpowiedz

10

jedynym możliwym sposobem, to może działać, jeśli jest stworzenie CGImageSourceCreateWithData() (lub URL cokolwiek), a następnie utworzyć CGImageRef użyciu CGImageCreateWithJPEGDataProvider lub CGImageCreateWithPNGDataProvider. Dzięki temu CGImageRef możesz WYPRÓBUJ użyć CGImageCreateWithImageInRect() i wyciągnąć podrozdział dużego obrazu.

Jeśli próbujesz zrobić to wstawić obraz, proszę, wyjaśnij pytanie, ponieważ potrzebowałbym więcej informacji.

+0

Wow to działa! Poprzednio ładowałem dane jpeg za pomocą [UIImage imageNamed ...]. Wygląda na to, że CGImageCreateWithJPEGDataProvider + CGImageCreateWithImageInRect() dekoduje tylko potrzebną część. Zanim to się zawsze zawiesiło z powodu niskiej ilości pamięci, teraz działa. Sprawdzę dokumentację, aby sprawdzić, czy istnieją dalsze wyjaśnienia dotyczące tych metod. Dla twojej informacji, celem jest załadowanie dużego obrazu z dysku i wysłanie go do opengl. Muszę ją wstawić w zależności od rozmiaru maksymalnego rozmiaru OpenGL obsługiwanego na urządzeniu. – AkademiksQc

+0

W przypadku naprawdę dużych plików JPEG można korzystać z libjpeg-turbo i ogólnodostępnej biblioteki open source, która wykorzystuje NEON do akceleracji armv7. Używam go w moim projekcie PhotoScrollerNetwork do układania i wyświetlania obrazów NASA 18000x18000 w telefonie! –

+0

OK, zagłębię się w to ... ale czy nie jest to tylko dekodowanie programowe? Myślałem, że muszę użyć ios SDK do wbudowanego dekodera sprzętowego jpeg. – AkademiksQc

Powiązane problemy