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.
Ł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
@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