/var/log

技術系のあれこれ。※内容は個人の発言であり、所属する組織を代表するものではありません。

Cocoaの仕様変更??

OpenGLViewで書いた内容を保存する手順を少し修正する必要があった.
といっても
今までとの違いは

GPUからCPU側に持ってくる(?)ところの記述で
下のようにGL_RGBからGL_RGBAに変更するだけだった.

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte*)img);


どうも
Snow Leopardになってから入れたXcodeからは
画像読み込みやNSColorを使っての操作でアルファチャンネルが勝手にオンになるみたい.

以前のCocoaだと
アルファチャンネルの存在を無視したコードを書いても
一応,動くことは動いていたのですが...

まぁ僕のソースの書き方がよくないので仕方ないか(笑









ちなみに
一連の手順を以下のような感じに書いています.


問題に気づいたのは保存した画像がつぶれてたからです.
以下のソースのsamplesの値が3ではなくて4になっていたので修正しました.


//ローカル変数の宣言
int i,j,k;
NSData* saveImageData = nil;
NSString* path = nil;
NSBitmapImageRep* bitmap = nil;
int width,height,rowbytes,samples;
unsigned char *img=NULL,tmp;


//GPU(?)のピクセルデータを格納する為のNSBitmapImageRepを作る
[glView lockFocus];
bitmap = [[[NSBitmapImageRep alloc] autorelease] initWithFocusedViewRect:[glView bounds]];
[glView unlockFocus];

//情報を抽出(使わないものもある)
img = [bitmap bitmapData];
width = [bitmap pixelsWide];
height = [bitmap pixelsHigh];
rowbytes = [bitmap bytesPerRow];
samples = [bitmap samplesPerPixel];


/*
  OpenGLのglReadPixelsを使ってデータを読み込む
 */
//読み込むバッファを指定する
glReadBuffer(GL_FRONT);

//データの格納形式を指定する
glPixelStorei(GL_PACK_ALIGNMENT, 1);



//データの呼び出し
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte*)img);
				

//上下が反転して格納されているので元に戻す
for (j=0; j