3

かなり長い間この問題に苦労してきましたが、これまでのところ答えを見つけることができませんでした. 基本的に、私がやりたいことは、EAGLview のコンテンツをキャプチャし、それを使用して他の画像とマージすることです。とにかく、主な問題は、私の EAGLview で透明なものはすべて、フォトアルバムに保存したり、UIImageView に入れたりすると不透明になることです。別の場所で見つけたコードをいくつか共有させてください。

- (CGImageRef) glToUIImage {
unsigned char buffer[320*480*4];
glReadPixels(0,0,320,480,GL_RGBA,GL_UNSIGNED_BYTE,&buffer);
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320*480*4, NULL);
CGImageRef iref = CGImageCreate(320,480,8,32,320*4,CGColorSpaceCreateDeviceRGB(),kCGBitmapByteOrderDefault,ref,NULL,true,kCGRenderingIntentDefault);

size_t width         = CGImageGetWidth(iref);
size_t height        = CGImageGetHeight(iref);
size_t length        = width*height*4;
uint32_t *pixels     = (uint32_t *)malloc(length);
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextTranslateCTM(context, 0.0, height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0.0, 0.0, width, height), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(context);
UIImage *outputImage = [UIImage imageWithCGImage:outputRef];

UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil);
return outputRef;

}

すでに述べたように、これは EAGLview のコンテンツを完全に取得しますが、アルファ値を含む画像を取得できません。

どんな助けでも感謝します。ありがとう!

4

1 に答える 1

2

透明性が失われている可能性があると思われる 2 つの場所:

  1. シーンを描いているとき: シーンの背景は透明ですか? (0,0,0,1) ではなく (0,0,0,0) のようなものに対して glClear を実行していることを確認してください。
  2. 画像を描画して裏返すとき: デフォルトの背景色は何ですか? それは不透明な黒である可能性が高く、シーンの透明な部分があった場所で終わるでしょう。

裏返す前に画像を保存することで、#2 が問題かどうかを確認できます。問題がある場合は、Core Graphics 呼び出しを使用するのではなく、ピクセル バッファー内のメモリを直接裏返すことで、裏返しプロセスを回避できます。

于 2009-07-05T22:43:11.950 に答える