概要:NSOpenGLViewから一部のファイル形式にピクセルデータをエクスポートすると、誤った色になります
私はいくつかの実験データを視覚化するためのアプリケーションを開発しています。その機能の1つは、NSOpenGLView
サブクラスでデータをレンダリングし、結果の画像をファイルにエクスポートしたり、クリップボードにコピーしたりできるようにすることです。
NSImage
ビューは、次のように生成されたとしてデータをエクスポートします。
- (NSImage*) image
{
NSBitmapImageRep* imageRep;
NSImage* image;
NSSize viewSize = [self bounds].size;
int width = viewSize.width;
int height = viewSize.height;
[self lockFocus];
[self drawRect:[self bounds]];
[self unlockFocus];
imageRep=[[[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:width
pixelsHigh:height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:width*4
bitsPerPixel:32] autorelease];
[[self openGLContext] makeCurrentContext];
glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,[imageRep bitmapData]);
image=[[[NSImage alloc] initWithSize:NSMakeSize(width,height)] autorelease];
[image addRepresentation:imageRep];
[image setFlipped:YES]; // this is deprecated in 10.6
[image lockFocusOnRepresentation:imageRep]; // this will flip the rep
[image unlockFocus];
return image;
}
コピーでは、次のようにこの画像を非常に簡単に使用します。
- (IBAction) copy:(id) sender
{
NSImage* img = [self image];
NSPasteboard* pb = [NSPasteboard generalPasteboard];
[pb clearContents];
NSArray* copied = [NSArray arrayWithObject:img];
[pb writeObjects:copied];
}
ファイルの書き込みには、ImageKitIKSaveOptions
アクセサリパネルを使用して出力ファイルの種類と関連するオプションを設定し、次のコードを使用して書き込みを行います。
NSImage* glImage = [glView image];
NSRect rect = [glView bounds];
rect.origin.x = rect.origin.y = 0;
img = [glImage CGImageForProposedRect:&rect
context:[NSGraphicsContext currentContext]
hints:nil];
if (img)
{
NSURL* url = [NSURL fileURLWithPath: path];
CGImageDestinationRef dest = CGImageDestinationCreateWithURL((CFURLRef)url,
(CFStringRef)newUTType,
1,
NULL);
if (dest)
{
CGImageDestinationAddImage(dest,
img,
(CFDictionaryRef)[imgSaveOptions imageProperties]);
CGImageDestinationFinalize(dest);
CFRelease(dest);
}
}
(ここでは少し余分なコードをトリミングしましたが、私が見る限り、結果に影響を与えるものは何もありません。これはパネルnewUTType
からのものです。)IKSaveOptions
これは、ファイルがGIF、JPEG、PNG、PSD、またはTIFFとしてエクスポートされる場合は正常に機能しますが、PDF、BMP、TGA、ICNS、およびJPEG-2000にエクスポートすると、画像の一部に赤色のアーティファクトが生成されます。以下に画像の例を示します。最初の画像はJPGとしてエクスポートされ、2番目の画像はPDFとしてエクスポートされます。
(出典:walkytalky.net)
(出典:walkytalky.net)
クリップボードへのコピーでは、の現在の実装ではこの赤いストライプは表示されませんが、image
。ではなくusingを生成した元の実装では表示されました。したがって、OpenGLから取得したピクセルの色表現に問題があり、その後の変換が適切に行われないと推測していますが、どうすればよいか迷っています。imageRep
NSCalibratedRGBColorSpace
NSDeviceRGBColorSpace
それで、誰かが私に(i)これを引き起こしているもの、そして(ii)どうすればそれをなくすことができるか教えてもらえますか?私はすべてのフォーマットについてはあまり気にしませんが、少なくともPDFが機能することを本当に望んでいます。