こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

objective-c 画像の反転と回転

Cについては、全くの素人です。

読み込んだ画像を回転および反転して保存したいのですが、
画像の取り扱いが全くわからないのでご教授をお願いします。

webや書籍を探してみたのですが、画像の取り扱いについて記載しているものがなく困っています。

処理としては、複数毎の画像を読み取り、2枚目の画像を反転、3枚目を回転したいのです。
処理した画像を別名で保存するという流れです。
画像を読み取り、保存する処理は正常に行えています。

for(int i=0; i< [myImages count]; i++){
    NSImage *bitmap = [[NSImage alloc] initWithContentsOfFile:[[myImages objectAtIndex:i]imageRepresentation]];
    //反転
    
    // 回転処理
    
    // 画像保存
    NSData* indata = [bitmap TIFFRepresentation];
    NSBitmapImageRep* bitmapImageRep = [NSBitmapImageRep imageRepWithData:indata];

    NSData* outdata = [bitmapImageRep representationUsingType:NSJPEGFileType properties:[NSDictionary dictionary]];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
    NSString* path = [NSString stringWithFormat:@"%@/test_%d.jpg",[paths objectAtIndex:0],i, nil];
    [outdata writeToFile:path atomically:YES];
    [bitmap release];
}

回転処理については、調べた結果、NSAffineTransformを使う?ところまではわかったのですが、書式やらが全くわからない状態です。
反転処理は、setFlipped:YESで反転されるような文献を見つけたのですが、全く反転されません。

ご教授のほど、よろしくお願いします。

投稿日時 - 2010-02-22 01:15:40

QNo.5696252

困ってます

質問者が選んだベストアンサー

推奨する処理を先に書きます。
NSBitmapImageRepで、画像をピクセル単位で取得します。別のNSBitmapImageRepのインスタンスを作成し、それに1ピクセルずつ、反転する形、あるいは回転する形で移していきます。
ひじょうに時間のかかる処理ですが、じっさいにやってみると、1500×1000ピクセルくらいの画像でも、1秒かかるかかからないかです。

setFlipped、isFlippedは、画像を反転するメソッドではありません。結果的にそうなりますが、目的は、座標の変換です。Cocoaでは、座標の原点が左下にあるのは、ご存じだと思いますが、左上に原点があるほうが、処理しやすいことが多々あります。むしろ「なんでデフォルトが左下やねん」とぼやきたくなるくらいです。setFlipped、isFlippedをYESにすると、座標の原点が左上に変わります。画像を反転するのではなく、座標を反転するのだと理解してください。
NSAffineTransformについても、用途を誤解なさっているように見受けられます。これも画像を移動、回転するものではなく、座標軸を移動、回転するものです。座標をいじるのですから、目的の処理が終了したあと、座標を元に戻しておかないと、そのあとわけがわからないことが発生します。
NSAffineTransformを使うより、NSViewに、subviewを縮小拡大したり、回転するメソッドがあるので、それで反転、回転したほうが、わかりやすいでしょう。

※Mac OS X 10.6より、NSImageのsetFlipped、isFlippedメソッドは廃止されます。Xcodeで、Mac OS X 10.5互換でコンパイルしないと、エラーになります。

投稿日時 - 2010-02-22 06:38:10

お礼

アドバイスありがとうございます。

NSBitmapImageRepを使ってピクセル単位で取得していく方法で、やってみようと思います。

と、思って調べてみたのですが、いろいろと検索してみたりしたのですが、objective-cでの該当の処理をするような情報がなく困っています。

投稿日時 - 2010-02-22 17:22:57

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> と、思って調べてみたのですが、いろいろと検索してみたりしたのですが、objective-cでの該当の処理をするような情報がなく困っています。

Xcodeのヘルプを調べましょうよ。
それすら調べずに「情報がなく困って」いられては、相手にできません。
もとより、「英語が読めません」は論外。

投稿日時 - 2010-02-22 17:55:23

お礼

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

投稿日時 - 2010-02-23 02:59:31

あなたにオススメの質問