UIKitを使わずに画像を読み込みたい(OpenGL)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bonbo

UIKitを使わずに画像を読み込みたい(OpenGL)

#1

投稿記事 by bonbo » 12年前

以前まではiOSの方で

コード:

GLuint texture;// これに読み込んだ画像のデータが入る
	//画像ファイルを展開しCGImageRefを生成します
	CGImageRef image = [UIImage imageNamed:fileName].CGImage;
	if(!image){	//画像ファイルの読み込みに失敗したらfalse(0)を返します
		NSLog(@"Error: %@ not found",fileName);
		return 0;
	}
	//画像の大きさを取得します
	size_t width = CGImageGetWidth(image);

	size_t height = CGImageGetHeight(image);
	GLubyte* imageData = (GLubyte *) malloc(width * height * 4);
    
	CGContextRef imageContext = CGBitmapContextCreate(imageData,width,height,8,width * 4,CGColorSpaceCreateDeviceRGB(),kCGImageAlphaPremultipliedLast);// 第六引数がCGImageGetColorSpace(image)だと変になる
    
	CGContextDrawImage(imageContext, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), image);
    
	CGContextRelease(imageContext);
 	
	//OpenGL用のテクスチャを生成します
    
	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);
	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    
    for (int i=0; i<width*height; i++) {
        int r = imageData[i*4+0]; /* R要素 */
        int g = imageData[i*4+1]; /* G要素 */
        int b = imageData[i*4+2]; /* B要素 */
        if (r == 0 && g == 0 && b == 0) { /* ??に値を入れて任意の色を特定 */
            imageData[i*4+3] = 0; /* 透過する */
        } else {
            imageData[i*4+3] = 255; /* 透過しない */
        }
    }
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
	free(imageData);
のようにして画像の読み込みを行っていたのですが
今回UIKitが使えないので
三行目の

コード:

CGImageRef image = [UIImage imageNamed:fileName].CGImage;
が使えません。
なるべく透過などの処理を変えないでこのまま流用したいのですが
同様の処理をするにはどうしたらよいのでしょうか。
即ち、上記の処理なしでCGImageRefを取得する方法はあるでしょうか。
環境は
Xcode5.0.1
アプリケーションはMac64bit上で動作させています
よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: UIKitを使わずに画像を読み込みたい(OpenGL)

#2

投稿記事 by h2so5 » 12年前

OSXではUIImageの代わりにNSImageが利用できます。

bonbo

Re: UIKitを使わずに画像を読み込みたい(OpenGL)

#3

投稿記事 by bonbo » 12年前

>h2so5さん
ありがとうございます。
できました。おっしゃる通りNSImageに変えたら
処理をほぼ変えずに再現することができました。
びっくりです。
変更点ですが

コード:

CGImageRef image = [UIImage imageNamed:fileName].CGImage;
の部分を

コード:

NSImage *tempimg = [NSImage imageNamed:fileName];
    NSSize imageSize = [tempimg size];
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, imageSize.width, imageSize.height, 8, 0, [[NSColorSpace genericRGBColorSpace] CGColorSpace], kCGBitmapByteOrder32Host|kCGImageAlphaPremultipliedFirst);
    
    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:bitmapContext flipped:NO]];
    [tempimg drawInRect:NSMakeRect(0, 0, imageSize.width, imageSize.height) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
    [NSGraphicsContext restoreGraphicsState];
    
    CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
にすれば動くはずです。
参考にしたページ
http://stackoverflow.com/questions/1712 ... n-mac-os-x

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る