2013-08-02 9 views
9

Stworzyłem 32-bitowy NSImage z następującym kodem.Jak utworzyć 8-, 4- i 1-bitowe reprezentacje NSImage

NSBitmapImageRep *sourceRep = [[NSBitmapImageRep alloc] initWithData: imageData]; 

     // create a new bitmap representation scaled down 

      NSBitmapImageRep *newRep = 
       [[NSBitmapImageRep alloc] 
        initWithBitmapDataPlanes: NULL 
        pixelsWide: imageSize 
        pixelsHigh: imageSize 
        bitsPerSample: 8 
        samplesPerPixel: 4 
        hasAlpha: YES 
        isPlanar: NO 
        colorSpaceName: NSCalibratedRGBColorSpace 
        bytesPerRow: 0 
        bitsPerPixel: 0]; 

      // save the graphics context, create a bitmap context and set it as current 
      [NSGraphicsContext saveGraphicsState] ; 
      NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithBitmapImageRep: newRep]; 
      [NSGraphicsContext setCurrentContext: context] ; 

      // draw the bitmap image representation in it and restore the context 
      [sourceRep drawInRect: NSMakeRect(0.0f, 0.0f, imageSize, imageSize)] ; 
      [NSGraphicsContext restoreGraphicsState] ; 

      // set the size of the new bitmap representation 
      [newRep setSize: NSMakeSize(imageSize,imageSize)] ; 

      NSDictionary *imageProps2 = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithFloat:1.0], kCGImageDestinationLossyCompressionQuality, 
             nil]; 
      imageData = [newRep representationUsingType: NSPNGFileType properties: imageProps2]; 
    NSImage *bitImage = [[NSImage alloc]initWithData:imageData]; 

Teraz trzeba utworzyć 8 bit (256 kolorów), 4-bitowe (16 kolorów, 1 bit) (czarno-biały) NSBitmapImageRep & reprezentacji. co chcę teraz zrobić?

+0

Czy brałeś pod uwagę filtry Core Image? – uchuugaka

+0

@ peterhosey, wszelkie ograniczenia dotyczące licencji lub środowiska wykonawczego? jak musi być dostępny jako zbudowany w lib w 10.6 itd.? –

+2

@GradyPlayer: Nie mam żadnych takich ograniczeń, nie. (Po prostu płaci się za pytania na święta, nie potrzebuję tego do pracy lub czegoś.) –

Odpowiedz

2

Niestety, uważam, że nie można używać grafiki głównej. Konteksty graficzne nie obsługują niczego z tymi kilkoma bitami.

Dokumentacja ma tabelę z supported pixel formats.

Widocznie Carbon miał (ma?) Wsparcie dla niej, jak widać odwołuje tu gdzie również lament brak Cocoa wsparcia dla niej:

Okazuje się, że w zasadzie Cocoa/Quartz nie obsługuje Próbkowanie obrazów do 8 -bitowy kolor. Obsługuje ich rysowanie i wspiera upsampling, ale nie idzie w drugą stronę. Domyślam się, że jest to celowy projekt ze strony Apple, aby odejść od indeksowanych obrazów jako standardowego typu danych graficznych - w końcu kolor 32-bitowy jest znacznie prostszy, prawda? Cóż, jest, ale nadal istnieją przydatne zastosowania dla 8-bitów. Więc ... co robić? Jedną z możliwości jest użycie dwutlenku węgla, ponieważ gen/Quickdraw General/GWorld obsługuje próbkowania ze zredukowaną częstotliwością, itp

Od this thread

0

dobrze to prawdopodobnie będzie zbyt długo na komentarz ...

Wygląda na to, że po prostu nie jest to możliwe ... wszystkie części do rysowania kakao naprawdę chcą korzystać z 24-bitowych przestrzeni kolorów ... Udało mi się zrobić 8bit NSBitmapImageRep, ale była to skala szarości.

Więc domyślam się, że musimy się dowiedzieć, , dlaczego tutaj. Jeśli chcesz mieć możliwość używania NSImages, które są wspierane przez pewne typy reprezentacji, nie sądzę, że jest to możliwe.

jeśli chcesz naive down sample (zmienić na najbliższą 24/32-bitową wartość na dowolny piksel), to jest bardzo możliwe; byłoby to nadanie wyglądu 8-bitowych obrazów.

Jeśli chcesz mieć możliwość zapisywania tych plików z dobrymi kolorami ditheringu/indeksu, to myślę, że najlepszą opcją byłoby napisanie do formatu obrazu, który obsługuje to, co chcesz (np. Zapisywanie do 256-kolorowego GIF-a).

Jeśli chciał zrobić próbkowanie się z jakiegoś powodu, są 2 problemy pod ręką

  1. palet lub wybór CLUT.
  2. Roztrząsanie.

Jeśli nie chcesz korzystać z indeksowanych kolorów i chcesz rozbić 8-bitów na 3-3-2 RGB, co jest nieco łatwiejsze, ale wynik jest znacznie gorszy niż indeksowany kolor.

4-bitowy jest nieco tricker, ponieważ tak naprawdę nie znam dobrego historycznego wykorzystania 4-bitowego koloru.

Użyłem kolorów indeksowanych do wyświetlania czasów ucieczki z zestawu mandelbrota w małym projekcie, który zrobiłem raz ...

Właśnie sprawdziłem, że już nie działa (był stary naprawiony potok renderowania OpenGL).

, ale zasadniczo dla widoku można użyć glPixelMapuiv do odwzorowania kolorów indeksu na wartość bajtów, a następnie wyświetlić bufor bajtowy z glDrawPixels;

Więc ... Jeśli komentujesz i mówisz, dlaczego próbujesz robić to, co robisz, być może będziemy w stanie Ci pomóc.

+0

Wild guess: Generowanie starych reprezentacji ikon, takich jak "icl8'',' 'icl4'' i '' ICN # '', z ikony 32-bitowej. –

3

Niestety wydaje się, że kakao nie obsługuje pracy na obrazach paletowanych.

Byłem trying that before i mój wniosek jest taki, że nie jest możliwe dla PNG. NSGIFFileType to wyjątek zakodowany na stałe, a konteksty graficzne to even more limited niż reprezentacje bitmap (np. RGBA jest obsługiwane tylko z premiliplied alfa).

Aby obejść to, I convert NSBitmapImageRep to raw RGBA bitmap, użyj libimagequant to remap it to a palette, a następnie libpng lub lodepng, aby napisać plik PNG.

Powiązane problemy