2010年02月02日

画像ファイルから生データ(RGBA値)を取得するiPhoneプログラム - (iPhone SDK, OpenGL)

blog_2_1

プラットフォーム:iPhone
ライブラリ:OpenGL ES, iPhone SDK

PNGファイルなどの画像ファイルを読み込んで、生のRGBAデータを取得するプログラムです。このプログラムをビルドするには、CoreGraphicsフレームワークが必要です。

まずは、画像ファイルを読み込むプログラムです。これは、非常に簡単で、関数を呼ぶだけです。filenameに画像ファイル名を指定します。
CGImageRef img = [UIImage imageNamed:filename].CGImage;

これで、画像が読み込めましたが、生データではありません(ポインタでRGBAを参照できない)。読み込んだ画像から生データを取り出します。
size_t w = CGImageGetWidth(img);
size_t h = CGImageGetHeight(img);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(img);

GLubyte* pixels = (GLubyte*)malloc(w * h * 4);
CGContextRef context = CGBitmapContextCreate(pixels, w, h, 8, w * 4, colorSpace, kCGImageAlphaPremultipliedLast);

CGContextDrawImage(context, CGRectMake(0, 0, (CGFloat)w, (CGFloat)h), img);

CGContextRelease(context);


CGBitmapContextCreate関数で、contextとpixelsを関連づけています。つまり、contextに対して描画すると、pixelsが書き換えられるというわけです。そこで、CGContextDrawImage関数で、読み込んだ画像imgをcontext(つまり、pixels)に描画しています。生データ(pixels)が手に入ればcontextはいらないので、CGContextRelease関数で破棄します。

以上です。

いろいろな関数を使ったので、後でリファレンス記事を書こうかな。

    • 0 Comment |
    • 0 Trackback |
    • このエントリーをはてなブックマークに追加
2010年01月30日

iPhone SDKのOpenGLで長方形を描画 - (iPhone SDK, OpenGL)

blog_2_1

プラットフォーム:iPhone(Simulator)
言語:Objective-C, C/C++
ライブラリ:OpenGL, iPhone SDK

iPhoneSDKのOpenGLの勉強をしています。
まずは、基本からということで、長方形を描画する関数drawRectを作成しました。
以下は関数のソースコードです。
void drawRect(
    const float x,  //x座標
    const float y,  //y座標
    const float w,  //幅
    const float h,  //高さ
    const unsigned char r,  //RGBのRed
    const unsigned char g,  //RGBのGreen
    const unsigned char b  //RGBのBlue
)
{
    const GLfloat vertex[] = {
        x, -h + y,
        w + x, -h + y,
        x, y,
        w + x, y
    };

    const GLubyte color[] = {
        r, g, b, 255,
        r, g, b, 255,
        r, g, b, 255,
        r, g, b, 255
    };

    glVertexPointer(2, GL_FLOAT, 0, vertex);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, color);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

関数のテストをしてみます。
Xcodeを起動して「OpenGL ES Application」プロジェクトを新規作成します。
そして、EAGLView.mファイルのdrawView関数を編集します。
コードは以下のようになります。
- (void)drawView {
    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    drawRect(-0.5f, 0.5f, 1.0f, 1.0f, 255, 0, 0);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

ビルド→実行の結果は以下のようになります。
drawRect


    • 0 Comment |
    • 0 Trackback |
    • このエントリーをはてなブックマークに追加
2010年01月25日

UITableViewに必要なUITableViewDataSourceプロトコルのメソッド-(Mac OS X, iPhone, Objective-C)

CA3A0063

iPhone SDK プログラミング [UITableViewの利用] - (iPhone[Mac OS X], Objective-C)」の続き。

今回は、UITableViewDataSourceプロトコルの必須メソッドについて。
テーブルを使用するにあたって、必ず実装しなければならないものは、以下の2つのメソッドです。
(1) -(NSInteger)tableView:(UITableView*)tableView
         numberOfRowsInSection:(NSInteger)section

(2) -(UITableViewCell*)tableView:(UITableView*)tableView
         cellForRowAtIndexPath:(NSIndexPath*)indexPath

です。
(1)はテーブルに表示する行数を取得するためのメソッドで、(2)は表示するセルを取得するメソッドです。

さらに、セクションを使う場合は、以下の2つのメソッドを実装します。
(3) -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
(4) -(NSString*)tableView:(UITableView*)tableView
         titleForHeaderInSection:(NSInteger)section

です。
(3)はセクションの数を取得します。デフォルトでは1を返します。(4)はセクションのタイトルを取得します。実装しない場合、タイトルは表示されません。

    • 0 Comment |
    • 0 Trackback |
    • このエントリーをはてなブックマークに追加
2010年01月24日

iPhone SDK プログラミング [UITableViewの利用] - (iPhone[Mac OS X], Objective-C)

CA3A0024

OS:Max OS X(iPhone)
言語:Objective-C

せっかくMacBookに移行したので、iPhoneアプリのプログラミングを勉強することにした。

iphone_table左図のようなユーザインタフェースをテーブルをいう。今回は、左図と同じテーブルを実装してみる。以下の手順で行う。


1.X-codeを起動して、「Window-Based Application」の新規プロジェクトを作成する。プロジェクト名は「table」とした。


2.tableAppDelegate.hにUITableViewDataSourceというプロトコルを追加する。このプロトコルはテーブルに表示するデータを扱うメソッドを定義しているらしい。以下はコードです(赤字の部分が追加したコード)。


@interface tableAppDelegate : NSObject <UIApplicationDelegate, UITableViewDataSource>
{
    NSArray* names1;
    NSArray* names2;
    UIWindow* window;
}

@property (nonatomic, retain) IBOutlet UIWindow* window;

@end


3.InterfaceBuilderでユーザインタフェースを作成する。InterfaceBuilderのLibraryウィンドウからTableViewをドラッグ&ドロップで貼付ける。

4.taleAppDelegate.mファイルを編集する。テーブルを使うろきの必須メソッドとセクションに関連するメソッドを実装する。以下はコードです(赤字は追加したコード)。

#import "tableAppDelegate.h"

@implementation tableAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    names1 = [[NSArray arrayWithObjects:@"Cell1", @"Cell2", @"Cell3", @"Cell4", nil] retain];
    names2 = [[NSArray arrayWithObjects:@"Cell1", @"Cell2", @"Cell3", nil] retain];

   
    // Override point for customization after application launch
    [window makeKeyAndVisible];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
{
    return 2;
}


- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section
{
    switch ( section ) {
        case 0:
            return @"Section1";
            break;
           
        case 1:
            return @"Section2";
            break;
    }
   
    return nil;
}

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    switch ( section ) {
        case 0:
            return [names1 count];
            break;
           
        case 1:
            return [names2 count];
            break;
    }
   
    return 0;
}

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
   
    if ( !cell ) {
        cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"UITableViewCell"];
        [cell autorelease];
    }
   
    switch ( indexPath.section ) {
        case 0:
            cell.text = [names1 objectAtIndex:indexPath.row];
            break;
           
        case 1:
            cell.text = [names2 objectAtIndex:indexPath.row];
            break;
    }
   
    return cell;
}


- (void)dealloc {
    [window release];
    [super dealloc];
}

@end



5.コンパイルして、結果を確認する(左上のように表示されるはず)。

    • 0 Comment |
    • 0 Trackback |
    • このエントリーをはてなブックマークに追加