2011-02-09 15 views
2

iPhone写真ライブラリから画像を取得した後に、iPhone文書ディレクトリにUIImageを保存してからロードしようとしています。それは可能ですが、何らかの理由で画像をロードすると、それを反時計回りに90度回転します。ここに私のsaveImageとloadImageメソッドです:iPhone/Xcode:UIImageとUIImageViewはプログラムと一緒に取得しません

画像保存:

- (void)saveImage: (UIImage*)image{ 
if (image != nil) 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString* path = [documentsDirectory stringByAppendingPathComponent: 
         [NSString stringWithString: @"lePhoto.png"] ]; 
    //NSData* data = UIImagePNGRepresentation(image); 
    //[data writeToFile:path atomically:YES]; 
    [UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 
    } 
} 

ロードイメージ:

- (NSData*)loadImage{ 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString* path = [documentsDirectory stringByAppendingPathComponent: 
        [NSString stringWithString: @"lePhoto.png"] ]; 
NSData *data = [[NSData alloc] initWithContentsOfFile:path]; 


//UIImage *image = [[UIImage alloc] initWithData:data]; //my second try 
//UIImage* image = [UIImage imageWithContentsOfFile:path]; //first try 
//return image; 
return data; 
[data release]; 
} 

そして、私は今、いくつかのために、それは希望かどうかを確認するために、このように画像をロードしています狂った理由、私の問題を解決する(これは明らかに、しませんでした):

UIImage* theImage = [[UIImage alloc] initWithData:[self loadImage]]; 

私は私が持っているいくつかのテストを行っています2つのUIImageViewsが並んでいます。左側に1つは表示されずに画像を保存してロードします(画像がImagePickerから選択されると画像がまっすぐに表示されます)。セーブロードが発生します。右の方がCCWを90度回転させる唯一のものです。セーブ/ロードしていない画像は正しく表示されています。これは実際のiPhoneでのみ発生します。シミュレータは、両方の画像を正しく表示します。私は多くの、多くの時間それを把握しようとしたが、役に立たない。これを引き起こしている可能性のあるものは何ですか?

編集:明らかにイメージでも、明らかにそうでないときでさえ、それは指向していると言わなければなりません!すべてのコードが実行された後にのみ回転します。私は、コードを変更して、それが変わるかどうかを確認するために、強制的に再描画を試みましたが、そうではありません(それは間違っていても可能です。 また、iPhoneからスクリーンショットされた写真は自動回転しません。カメラで撮影した写真のみ。 [私はダウンロードした写真を試していませんでした]それは一番奇妙なことです...

あなたが私の写真をどのように引っ張っているのか疑問に思っているなら、 (これは明らかに、この機能を行うために必要なすべての方法ではないのですが、それは私が私のコードを書いてどのように洞察力を与える)やって:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
theimageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
[self saveImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"]]; 
[picker dismissModalViewControllerAnimated:YES]; 
} 

何かアドバイスは大歓迎です。そして、私はこれを多く知っています。何かばかげた、決して前に聞いたことのない問題を起こすための狂気をする方法があれば、明らかにそれを見つけるでしょう:P

+0

の代わりに

NSData* data = UIImageJPEGRepresentation(image,0.0); [data writeToFile:path atomically:YES]; 

:あなたは(そう、その行が実行されることはありません)復帰後にそれを解放するので、あなたはここにデータをリークしています。保持コール(alloc、retainまたはnew)を使用してリターンコールを作成する場合は、リターンの前に自動リリースする必要があります。 –

+0

私はそれをリリースしても、私はまだそこからデータを読むことができますか?私はそれを知らなかった。私はそれを変えます。ありがとう! –

+0

autoreleaseは、プールが排水されたときにAutoreleasePoolが-releaseを送信する要求です。あなたは解放したものからデータを読んではいけません。あなたはいつもオートレリースしたものからデータを読みます。 –

答えて

5

私はそれを考え出した。どうやらJPEG表現ではなくPNG表現で物事を保存すると、画像の向き情報は保存されません。このため、読み込まれたすべての画像は、デフォルトで上向きを示すようになります。これの代わりに

NSData* data = UIImageJPEGRepresentation(image,0.0); 
[data writeToFile:path atomically:YES]; 

::だから、最も簡単な方法はこれを行うことです

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 

そして、もちろん、.JPGへ.pngをからすべての画像の名前を変更します。上記のコードの0.0部分は、jpegに必要なアルファレベルを制御することです。これが将来人々を助けることを願っています!

0

私はあなたがAssets Library Frameworkを使用して画像を取得します。その場合は、結果ブロック内の画像の向きを取得し、調整するためにUIImageを操作する必要があります。ハァッ、どのような素晴らしい型名:

ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset) 
{ 
    ALAssetRepresentation* rep = [asset defaultRepresentation]; 
    _orientation = rep.orientation; 

... 

} 

脇:私は次のようなものがありますか?聖モルイ、Objective-Cは名前空間が必要ですか?

+0

うーん、私はそれを試みなければならないかもしれない。しかし、私は資産ライブラリを使用していません。私のEDITを見て、私がやったことについてさらに詳しい情報を得てください。混乱させて申し訳ありません。 –

0

ありがとうございます... このコードは、私のために数時間働いています。

あなたの質問に関係のない
[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 
関連する問題