2012-01-02 5 views
3

私は、事前に乗算されたアルファを本当によく理解していません。アルファチャンネルなしで24 bppのNSBitmapImageRepを作ることは可能ですか?

アルファチャンネルなしでNSBitmapImageRepが必要です(特定のbppは必要ありません)。私はそれがサポートされていないこの組み合わせを知っているが、私はこのような何かを必要と私は解決策が見つからない、

NSSize imageSize = NSMakeSize(200, 200); 

//create a non-alpha RGB image rep with the same dimensions as the image 
    NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] 
         initWithBitmapDataPlanes:NULL 
         pixelsWide:imageSize.width 
         pixelsHigh:imageSize.height 
         bitsPerSample:8 
         samplesPerPixel:3 
         hasAlpha:NO 
         isPlanar:NO 
         bitmapFormat:NSAlphaNonpremultipliedBitmapFormat 
         bytesPerRow:(3 * imageSize.width) 
         bitsPerPixel:24]; 

//lock focus on the bitmap 

    NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithBitmapImageRep:bitmap]; 
    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:context]; 

//draw the image into the bitmap 

[prueba drawAtPoint:NSMakePoint(0, 0) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont systemFontOfSize:24], NSFontAttributeName, nil]]; 

[NSGraphicsContext restoreGraphicsState]; 

//get the TIFF data 
    NSData* tiffData = [bitmap TIFFRepresentation]; 

//do something with TIFF data 
    NSError *error = nil; 
    [tiffData writeToFile:@"/Users/Paul/test.tif" options:NSDataWritingAtomic error:&error]; 

Error: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 3-component color space; kCGImageAlphaNone; 640 bytes/row.

オーケー:

私の問題は、このコードは私にエラーを与えるということです。

+1

'saveGraphicsState'と' restoreGraphicsState'の使用は意味がありません:一つのコンテキストで保存し、以前にそのコンテキストに保存していない別のコンテキストで復元します。グラフィックス状態は文脈ごとであり、逆の意味ではありません。 –

答えて

2

いいえ。 The formats that Quartz supports are listed here、そしてあなたが言ったエラーメッセージのように、アルファなしの24ビットはそれらの1つではありません。 AppKitの描画APIはQuartzの上に構築されているので、そのリストもAppKitに適用されます。

あなたが描画する前に、[NSColor blackColor]のような単色でコンテキストを塗りつぶすのが最善です。あなたはまだ文脈の中にアルファチャンネルを持っていますが、実際の透明性はありません。

+0

さて、アルファチャンネルのないTIFF画像が本当に必要ですが、これは重要です。アルファチャンネルなしのTIFF画像が必要なOCRエンジン "_tesseract_"を使用しているからです。 NSImage、NSBitmapImageRepなど。それらのすべてはアルファチャンネルを使用します。その後、私のための任意のソリューションをしてください? – PabloLerma

+0

@PabloLerma:Quartz/AppKit以外のものを使用して画像を生成するか、外部ツールを使用して画像を必要な形式に変換します。 –

+0

アイデア? ** Magick ++ **を検索していますが、私は他のツールを知りません – PabloLerma

0

明確化するために、NSBitmapImageRepは24ビット/ピクセルをサポートしています。ただし、NSGraphicsContextはこの形式をサポートしていません。明らかに、アルファチャンネルはQuartz描画システムで常に必要とされます。

+0

NSBitmapImageRepが24ビット/ピクセルをサポートしていれば、どうしてエラーが発生しますか? – PabloLerma

+0

NSBitmapImageRepは24ビット/ピクセルをサポートしていますが、NSGraphicsContextはそれをサポートしていません(エラーメッセージが示すように)。 –

関連する問題