2011-02-09 4 views
2

iPhone 사진 라이브러리에서 이미지를 가져온 후 iPhone 문서 디렉토리간에 UIImage를 저장하고로드하려고합니다. 그렇게 할 수는 있지만 어떤 이유로 이미지를로드 할 때 시계 반대 방향으로 90도 회전합니다.iPhone/Xcode : UIImage 및 UIImageView는 프로그램과 함께 제공되지 않습니다.

이미지 저장 : 여기 내 saveImage 및 loadImage 방법입니다

- (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]]; 

를 나는 내가 가진 몇 가지 테스트를 수행 한 두 개의 UIImageViews가 나란히 표시됩니다. 왼쪽에 하나는 표시 전에 이미지를 저장하고로드하지 않습니다 (ImagePicker에서 사진을 선택하면 이미지를 보여줍니다). 그리고 AFTER를 표시하는 오른쪽에 하나 저장로드가 발생합니다. 오른쪽에있는 것은 90도 CCW를 회전시키는 유일한 것입니다. 비 저장/불러 오기 그림이 올바르게 표시됩니다. 이것은 실제 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이 풀을 소모 할 때 보내도록 요청합니다. 출시 한 제품의 데이터는 읽지 않아야합니다. 언제든지 자동으로 리트리브 한 것들의 데이터를 읽습니다. –

답변

5

나는 그것을 알아. PNG 표현이 아닌 PNG 표현으로 물건을 저장할 때 분명히 이미지 방향 정보가 저장되지 않습니다. 이 때문에로드 된 모든 이미지는 기본적으로 방향을 표시합니다.이 대신

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

: 그래서, 가장 쉬운 방법은이 작업을 수행하는 것입니다

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

그리고, 물론, .JPG에 .png를 모든 사진의 이름을 변경. 위 코드의 0.0 부분은 jpeg에 필요한 알파 레벨을 제어하는 ​​것입니다. 희망이 사람을 미래에 도움이!

0

애셋 라이브러리 프레임 워크를 사용하여 이미지를 가져옵니다. 그렇다면 결과 블록에서 이미지의 방향을 얻고 UIImage를 조작하여 조정할 수 있습니다. 허, 정말 대단한 유형 이름 :

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

... 

} 

제외 : 나는 다음과 같은 일을 있나요? 신성한 몰리, Objective-C는 네임 스페이스가 필요합니다!

+0

흠, 나는 그것을 시도해야 할 수도 있습니다. 그러나 자산 라이브러리를 사용하고 있지 않습니다. 내 편집을보고 내가 한 일에 대해 더 많은 정보를 얻으십시오. 혼란을 드려 죄송합니다. –

0

고마워요 ... 이 코드는 몇 시간 씩 작업하고 저장했습니다. 귀하의 질문에

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 
관련 문제