Objective-C 画像の反転と回転

このQ&Aのポイント
  • Objective-Cを使用して、画像の反転と回転処理を行う方法について教えてください。
  • 反転処理にはNSImageのsetFlippedメソッドを使用しますが、正しく反転されません。
  • 回転処理にはNSAffineTransformを使用しますが、書式や使い方がわかりません。
回答を見る
  • ベストアンサー

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で反転されるような文献を見つけたのですが、全く反転されません。 ご教授のほど、よろしくお願いします。

  • S202
  • お礼率84% (142/169)

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

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

推奨する処理を先に書きます。 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互換でコンパイルしないと、エラーになります。

S202
質問者

お礼

アドバイスありがとうございます。 NSBitmapImageRepを使ってピクセル単位で取得していく方法で、やってみようと思います。 と、思って調べてみたのですが、いろいろと検索してみたりしたのですが、objective-cでの該当の処理をするような情報がなく困っています。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> と、思って調べてみたのですが、いろいろと検索してみたりしたのですが、objective-cでの該当の処理をするような情報がなく困っています。 Xcodeのヘルプを調べましょうよ。 それすら調べずに「情報がなく困って」いられては、相手にできません。 もとより、「英語が読めません」は論外。

S202
質問者

お礼

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

関連するQ&A

  • Objective-c 画像処理

    Cについては、全くの素人です。 「Xcodeプログラミング大全」という書籍を参考に、開発を進めているのですが、行き詰まってしまったので、質問させて下さい。 ImageKitを使ったイメージブラウザを作成して、取り込んだ画像を別名で別の場所に保存するプログラムを作成しています。 前半部は文字数の関係で省略します。 ボタンをクリックして画像を保存します。 - (IBAction)myButton:(id)sender; { // imagebrowserに保存した画像を順番に処理 for(int i=0; i< [myImages count]; i++){ NSData *data = nil; NSString *errorDescription; //NSPasteboard *pasteboard = [myImages objectAtIndex:i]; if([[[myImages objectAtIndex:i] types] containsObject:NSFilenamesPboardType]) data = [[myImages objectAtIndex:i] dataForType:NSFilenamesPboardType]; if(data){ NSArray *filenames = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:kCFPropertyListImmutable format:nil errorDescription:&errorDescription]; for(int j=0;j< [filenames count];j++){ //NSLog(@"%@",[filenames objectAtIndex:j]); NSBitmapImageRep* bitmap = [myImages objectAtIndex:i]; // 画像保存 NSData* outdata = [bitmap representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES); NSString* path = [NSString stringWithFormat:@"%@/test.png",[paths objectAtIndex:0], nil]; [outdata writeToFile:path atomically:YES]; / } } } } @end エラーは発生しないのですが、コンソールに「[MyImageObject types]: unrecognized selector sent to instance 0xf722590」と表示されます。 また、画像は全く保存されません。 どなたか、ご教授をお願いします。

  • objective-c initWithFocusedViewRectについて

    objective-cにて、画像を読み取り上下反転して保存する処理を行っているんのですが、次のプログラムを動作させてたときに縮尺が思ったとおりにいきません。 [bitmap lockFocus]; NSRect r = (0, 0, width,height); NSBitmapImageRep *rbitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:r]; [bitmap unlockFocus]; ここで、bitmapとrbitmapのサイズを調べてみると異なる数値が表示されます。 縮尺された感じです。 [bitmap]width:2272 height:1704 [rbitmap]widht:909 height:682 NSRectとinitWithFocusedViewRectについて調べてみたのですが、縮尺に関する記載がないように思えます。 同じサイズのbitmapを生成するには、initWithFocusedViewRectではダメなのでしょうか? ご教授の程、宜しくお願いします。

  • objective-cで困っています。

    objective-cをトライ&エラーで試しながら学習しているのですが、 下記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。 現在tml5のcanvasを使ってお絵描きアプリを作りました。このcanvasに書き込んだデータをiPhoneのカメラロールに保存することをトライしています。いろいろ調べてみると「HTML5 CANVASの描画内容をUIImage経由でカメラロールに保存する」という記事をみつけました。http://lab.spec5zigen.com/archives/html5-canvasの描画内容をuiimage経由でカメラロールに保存する/ その記事を参考に #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // UIWebViewのインスタンス化 CGRect rect = self.view.frame; UIWebView *webView = [[UIWebView alloc]initWithFrame:rect]; // Webページの大きさを自動的に画面にフィットさせる webView.scalesPageToFit = YES; // デリゲートを指定 webView.delegate = self; // URLを指定 NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxxxxxxxxxxxxx"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // リクエストを投げる [webView loadRequest:request]; // UIWebViewのインスタンスをビューに追加 [self.view addSubview:webView]; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ return YES; } NSString * requestString = [[request URL] absoluteString]; NSArray *params = [requestString componentsSeparatedByString:@"data:image/png;base64,"]; // dataFromBase64String // NSData+Base64 Copyright 2009 Matt Gallagher. All rights reserved. // http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];//decode base64 to NSData UIImage *image = [UIImage imageWithData:decodedData]; UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);//カメラロールに保存 return NO; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end としてみたのですが、 if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ の行にExpected identifierというエラーが、 NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];の行にNo known class method for selector 'dataFromBase64String:'というエラーが という状況で詰っている状況です。 メソッドの定義や宣言されていないメソッドを使っているなどのエラーということを調べて分かったのですが、objective-cを始めたばかりで初歩的なミスかも知れませんがエラーの対応の仕方がまだまだよくわかっていません。 スキーマなど参考にしたサイトの内容も十分に理解しているのではないのですが、「sp5canvas2app」の部分は自由に変えていいのでしょうか? 解決の仕方を教えていただけないでしょうか? 宜しくお願いします。

  • objective-c テキストファイルのカウンタ

    ■環境:xcode4.2 ■iOS:5.1 DocumentDirectoryに保存した テキストデータを利用した、 カウンターを制作しようとしております。 現状、テキストファイルから数字を読み出し、 1数値を足して、上書き保存するカウンターを試していますが、 結果蓄積されるテキストファイルは「1」になって、 以降2 3 ~と増えずに、思った動作をしておりません。 私は経験が浅く基本的なところが間違えているかもしれません。 どなたか、こちらの具体的な解決方法を ご教示いただけますでしょうか? よろしくお願いいたします。 //カウント テキスト読み込み NSArray *pathcount = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *count_moto = [[pathcount objectAtIndex:0]stringByAppendingPathComponent:@"count.text"]; //カウント加算 int count = [count_moto intValue]; int countplus = count++; NSString *fixcount = [NSString stringWithFormat:@"%d",countplus]; //カウント テキスト書き込み [fixcount writeToFile:count_moto atomically:YES encoding:NSUTF8StringEncoding error:NULL];

  • マイピクチャの画像の反転

    携帯からマイピクチャに画像を取り込んだら、画像が横向きになって保存されています。 画像を回転させてても又元に戻ります。以前、大分前ですが回転させたら固定した記憶があるのですが、、、 マイピクチャでの反転はできないのでしょうか? よろしくお願いいたします。

  • Iphoneシミュレータでtxtファイルを作成する

    Iphoneシミュレータでtxtファイルを作成する 現在、Iphoneシミュレータ(3.1.3)上でプログラムを書いているのですがうまく動きません。 動作の内容はファイルを作成して、そこに文字列を書き込むだけです。 具体的にコードをはらせていただきますと、 NSArray* paths; NSString* path; paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); path = [paths objectAtIndex:0]; path = [path stringByAppendingPathComponent:@"text.txt"];   NSString *str = @"hello";   [str writeToFile:path atomically:YES encodidng:NSUTF8StringEncoding error:nil]; このようなコードを書いております。 コンパイルは正常に通るのですが、実行してみると最後のwriteToFileの行までくると強制的におちてしまいます。 どこがおかしいのでしょうか?ご指導よろしくおねがいします。

  • 画像が反転するLCDモニター

    画像が反転するLCDモニターを探しています。液晶モニターの画像が 普通の状態から180℃回転して映し出すものを探しています。(19インチから20インチくらいのもの。)取扱いメーカー、商品型番等教えてください。

  • Objective-CからImageMagickを実行する

    過去に、画像変換処理などで質問させていただいたものです。 その節はありがとうございました。 開発環境では正常に画像の反転・回転が行えたのですが、開発したアプリを他のMac(Xcode未インストール)にコピーすると、画像の90度回転処理が異なる結果となってしまいました。 そこで、ImageMagickをコマンドから実行して、画像の加工処理を行おうと思っています。 しかし、コマンドを起動すると「launch path not accessible」と表示されます。 調べてみたところ、コマンドのパスが違うみたいなのですが、 ImageMagickのconvertにはパスは通しています。 また、コマンドをフルパスで指定しても、同じ結果になります。 NSTask *task = [[NSTask alloc]init]; [task setLaunchPath:@"コマンド"]; [NSArray *arguments = [NSArray arrayWithObjects:@"処理オプション",     @"参照元画像",     @"保存先画像",     nil]; [task setArguments:arguments]; [task launch]; [task waitUnitExit]; task release]; どなたか、お分かりになる方おられましたら、問題点・アドバイスをお願い致します。

  • Objective-CのNSTaskからAutomatorで作成したア

    Objective-CのNSTaskからAutomatorで作成したアプリを複数回実行するとフリーズするのですが、原因が分からないのでアドバイスをいただきたく書き込みさせていただきます。 Automatorの処理は、「イメージファイルにサムネールアイコンを追加」するだけの処理です。1度の実行で複数枚の画像を1枚ずつAutomatorに渡して処理を行います。 Automatorの実行は以下のような内容で実行しています。 -(BOOL)imageIcon(NSString *)filePath // 画像ファイルパス { NSTask *task = [[NSTask alloc]init]; NSURL *urlfilePath = [NSURL fileURLWithPath:filePath]; NSString *Command = [NSString stringWithFormat:@"/usr/bin/open"]; NSArray *argumets = [NSArray arrayWithObjects:@"-a", @"Automatorアプリのパス", [NSString stringWithFormat:@"%@",urlfilePath], nil]; [task setLaunchPath:Command]; [task setArguments:argumets]; [task launch]; [task waitUntilExit]; // 処理が完了していないのに処理を継続するのを防ぐ為、sleep [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]]; if([self processList:@"Automatorアプリ名"]){ //psコマンドを実行して、処理中ならYESを返す。 [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]]; } [task release]; return YES; } 上記の関数を各画像の処理時に呼び出しています。 上記の関数の先頭部にreturn YESで強制的に処理をすると、フリーズは発生しません。 また、フリーズした時は、Automatorアプリが実行中のままとなりますが、アクテビティモニタで見るとAutomatorアプリはありません。 Xcodeのコンソールにも、何も表示はありません。 説明がまとまっていなくてすいません。 どなたか、Objective-Cに精通されておられるかたおられまいたら、アドバイスをお願い致します。

  • objective-c 描画処理について

    初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。

専門家に質問してみよう