2012-04-30 12 views
5

Mam kilka plików graficznych w zastrzeżonym formacie binarnym, które chcę załadować do NSImages. Format nie jest prostą bitmapą, ale raczej rodzajem reprezentacji RLE zmieszanej z przezroczystością i różnymi dodatkowymi informacjami.Zalecane podejście do ładowania zastrzeżonego pliku obrazu binarnego do NSImage?

Aby wyświetlić jedno z tych obrazów w aplikacji Cocoa, potrzebuję sposobu, aby przeanalizować bajt pliku obrazu według bajtu i "obliczyć" bitmapę, którą następnie wstawię do NSImage.

Co jest dobrym podejściem do robienia tego w Objective-C/Cocoa?

Odpowiedz

7

Zadania interpretacji danych obrazu są obsługiwane przez obiekty reprezentacji obrazu. Aby użyć własnego formatu, masz kilka opcji: (a) utwórz niestandardową klasę reprezentacji, (b) użyj NSCustomImageRep z niestandardowym przedstawicielem lub (c) użyj niestandardowego obiektu do przetłumaczenia obrazu na obsługiwany format, taki jak surowa bitmapa.

Jeśli zdecydujesz się utworzyć niestandardową klasę reprezentacji, utworzysz podklasę o nazwie NSImageRep zgodnie z opisem w Creating New Image Representation Classes. Zasadniczo wymaga to, aby twoja klasa się zarejestrowała i była w stanie narysować dane obrazu. Oprócz tego możesz przesłonić metody, aby zwrócić informacje o obrazie, a będziesz mógł tworzyć instancje obrazów przy użyciu zwykłych metod NSImage. Ta metoda wymaga największej pracy.

Używanie NSCustomImageRep wymaga mniej pracy niż tworzenie niestandardowej implementacji. Twój obiekt uczestnika musi tylko być w stanie narysować obraz w stałej lokalizacji. Jednak nie można zwrócić innych informacji o obrazie, a przed utworzeniem NSImage należy ręcznie utworzyć obiekt NSCustomImageRep.

Tłumaczenie obrazu na inny format jest również prostsze niż tworzenie niestandardowej reprezentacji. Może to być tak proste, jak utworzenie pustego rozmiaru o odpowiednim rozmiarze i wciągnięcie do niego. Utworzenie obrazu jest jeszcze bardziej skomplikowane, ponieważ trzeba wywołać metodę tłumaczenia, co wpłynie na wydajność (zarówno przyszły czas rysowania, jak i wykorzystanie pamięci), ponieważ zmienia się formaty, które mogą być dobre lub złe. Utracisz także wszelkie powiązania między obiektem obrazu a jego źródłem.

+0

Ładne podsumowanie dostępnych opcji, dzięki! Jeśli chodzi o trzecią opcję: musiałem wykonać konwersję tylko raz, podczas tworzenia 'NSImage', prawda? Jak wpłynie to na przyszły czas losowania? Ponadto, jaki jest najbardziej efektywny sposób na wciągnięcie w "NSImage"? Czytałem gdzieś o rozwiązaniu, które wymagało tworzenia obiektu 'NSColor' za każdym razem, gdy został zapisany piksel. To nie wydaje się zbyt wydajne, ponieważ muszę przetworzyć kilkaset megabajtów danych obrazu. – tajmahal

+0

@tajmahal Tak, rysunek byłby wykonywany tylko raz. W przyszłości rysowanie będzie wykonywane przy użyciu dowolnego formatu, na który się skonwertujesz, co prawdopodobnie byłoby tak szybkie, jak to tylko możliwe, jeśli tylko narysujesz obraz. Jeśli twój format jest formatem bitmapowym, możesz go "narysować", zmieniając go w format bitmapy 'NSImage' obsługuje zamiast tworzyć obiekty kolorowe i rysować pojedyncze piksele. Jeśli twój format jest formatem wektorowym, chciałbyś użyć rysunków kakao lub funkcji Core Graphics, aby go narysować. CG ma również obiekty cieniowania, które umożliwiają podanie koloru w każdym pikselu za pomocą funkcji. – ughoavgfhw

Powiązane problemy