2013-08-02 82 views
9

我用以下代碼創建了32位NSImage。如何創建NSImage的8位,4位和1位表示法

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]; 

現在我需要創建8位(256色),4位(16個色),1位(黑&白)NSBitmapImageRep表示。我現在想要做什麼?

+0

您是否考慮過Core Image過濾器? – uchuugaka

+0

@ peterhosey,對許可證或運行時注意事項有何限制?像10.6等中的lib一樣必須可用? –

+2

@GradyPlayer:我沒有任何這樣的限制,沒有。 (我只是在爲節假日提出問題;我不需要這樣的工作或其他東西。) –

回答

2

不幸的是,我相信你不能使用核心圖形。圖形上下文不支持那幾位數的任何東西。

該文檔有一個表格supported pixel formats

顯然碳有(有?)對它的支持,因爲看到這裏引用他們也感嘆可可的缺乏支持它:

原來,基本上可可/石英不支持採樣圖像8位顏色。它支持繪製它們,它支持上採樣,但不會以其他方式。我想這是蘋果公司有意從標準圖形數據類型轉換成索引圖像的一部分 - 畢竟,32位顏色要簡單得多,對吧?嗯,它是,但仍然有用於8位。那麼該怎麼辦?一種可能性是使用碳,因爲一般/ QuickDraw的的通​​用/ GWorld不支持採樣等

this thread

0

嗯,這可能將是太長了評論...

它肯定似乎這是不可能的...所有可可的繪圖部分似乎都想使用24位顏色的顏色空間......我能夠製作一個8位的NSBitmapImageRep,但它是灰度級的。

所以我想我們必須弄清楚爲什麼在這裏。如果你想能夠使用支持某些類型的表示的NSImages,我不認爲這是可能的。

如果你想天真地取樣(改變到最接近任何像素的24/32位值),這是非常可能的;這將是爲了給出8位圖像的外觀。

如果您希望能夠以良好的抖動/索引顏色寫出這些文件,那麼我認爲最好的選擇是寫入支持所需內容的圖像格式(如寫入256色GIF)。

如果你想做到這一點採樣自己的一些原因,目前在手的2個問題:

  1. 托盤或CLUT選擇。
  2. 抖動。

如果你不想使用索引顏色,只是想將8位分成3-3-2 RGB這樣稍微簡單一點,但結果比索引顏色差得多。

4位有點竅門,因爲我甚至不知道4位顏色的良好歷史用法。

我使用索引顏色來顯示從一個小項目中設置的mandelbrot的轉義時間我曾經做過...

我剛剛證實,它不工作了(是固定渲染管道OpenGL老)。

但基本上爲您的視圖,您將使用glPixelMapuiv將索引顏色映射到一個字節值,然後用glDrawPixels顯示字節緩衝區;

所以......我想如果你評論並說出你爲什麼試圖做你正在做的事情,我們可能會提供幫助。

+0

瘋狂猜測:從32位圖標生成舊圖標表示,如icl8'',icl4''和'ICN #''。 –