2013-10-31 6 views
0

사용자가 카메라에서 사진을 찍을 수있는 코드를 작성하려고합니다. 그러면 지정된 사용자 인터페이스에 표시되고 나중 사용자를 위해 서버에 업로드됩니다. 나는 장치로 iPad를 사용하고 있습니다. 그러나 사용자가 사진을 찍으면 90도 회전합니다. 또한, 잘못 스케일링됩니다. 종횡비는 사진이 찍은 것과 다릅니다.카메라에서 가져온 iOS 스케일 이미지

NSData *imageData = UIImageJPEGRepresentation(scaleAndRotateImage(image), 0.90f); 

이 내가에서있는 UIImage 얻을 방법은 다음과 같습니다 http://pastebin.com/HxNkb7Be

내 서버에 파일을 업로드, 나는 이미지의 데이터과 같이 얻을 : 이것은 내가 확장 사용하고 코드와 크기 카메라 :

// Get the asset representation 
ALAssetRepresentation *rep = [asset defaultRepresentation]; 

// Get the right orientation 
UIImageOrientation orientation = UIImageOrientationUp; 
NSNumber *orientationValue = [[rep metadata] objectForKey:@"Orientation"]; 
if (orientationValue != nil) { 
    orientation = [orientationValue intValue]; 
} 

// Get the CG image reference and convert to UIImage 
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:rep.scale orientation:orientation]; 

답변

4

때문에 도우미 메서드 [담당자 fullResolutionImage]이 될 수 당신은 사용합니다. 다음은 당신이 원하는 것을 얻기 위해 사용할 수있는 좋은 방법입니다.

- (UIImage *)image:(UIImage *)image scaledCopyOfSize:(CGSize)newSize { 

UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; 
UIImageOrientation imageOrientation = UIImageOrientationLeft; 

switch (deviceOrientation) 
{ 
case UIDeviceOrientationPortrait: 
imageOrientation = UIImageOrientationRight; 
NSLog(@"UIImageOrientationRight"); 
break; 
case UIDeviceOrientationPortraitUpsideDown: 
imageOrientation = UIImageOrientationLeft; 
NSLog(@"UIImageOrientationLeft"); 
break; 
case UIDeviceOrientationLandscapeLeft: 
imageOrientation = UIImageOrientationUp; 
NSLog(@"UIImageOrientationUp"); 
break; 
case UIDeviceOrientationLandscapeRight: 
imageOrientation = UIImageOrientationDown; 
NSLog(@"UIImageOrientationDown"); 
break; 
default: 
NSLog(@"Default"); 
imageOrientation = UIImageOrientationRight ; 
break; 
} 

CGImageRef imgRef = image.CGImage; 

CGFloat width = CGImageGetWidth(imgRef); 
CGFloat height = CGImageGetHeight(imgRef); 

CGAffineTransform transform = CGAffineTransformIdentity; 
CGRect bounds = CGRectMake(0, 0, width, height); 
if (width > newSize.width || height > newSize.height) { 
CGFloat ratio = width/height; 
if (ratio > 1) { 
bounds.size.width = newSize.width; 
bounds.size.height = bounds.size.width/ratio; 
} 
else { 
bounds.size.height = newSize.height; 
bounds.size.width = bounds.size.height * ratio; 
} 
} 

CGFloat scaleRatio = bounds.size.width/width; 
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 
CGFloat boundHeight; 
UIImageOrientation orient = imageOrientation; 
switch(orient) { 

case UIImageOrientationUp: //EXIF = 1 
transform = CGAffineTransformIdentity; 
break; 

case UIImageOrientationUpMirrored: //EXIF = 2 
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); 
transform = CGAffineTransformScale(transform, -1.0, 1.0); 
break; 

case UIImageOrientationDown: //EXIF = 3 
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); 
transform = CGAffineTransformRotate(transform, M_PI); 
break; 

case UIImageOrientationDownMirrored: //EXIF = 4 
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); 
transform = CGAffineTransformScale(transform, 1.0, -1.0); 
break; 

case UIImageOrientationLeftMirrored: //EXIF = 5 
boundHeight = bounds.size.height; 
bounds.size.height = bounds.size.width; 
bounds.size.width = boundHeight; 
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); 
transform = CGAffineTransformScale(transform, -1.0, 1.0); 
transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
break; 

case UIImageOrientationLeft: //EXIF = 6 
boundHeight = bounds.size.height; 
bounds.size.height = bounds.size.width; 
bounds.size.width = boundHeight; 
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); 
transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
break; 

case UIImageOrientationRightMirrored: //EXIF = 7 
boundHeight = bounds.size.height; 
bounds.size.height = bounds.size.width; 
bounds.size.width = boundHeight; 
transform = CGAffineTransformMakeScale(-1.0, 1.0); 
transform = CGAffineTransformRotate(transform, M_PI/2.0); 
break; 

case UIImageOrientationRight: //EXIF = 8 
boundHeight = bounds.size.height; 
bounds.size.height = bounds.size.width; 
bounds.size.width = boundHeight; 
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); 
transform = CGAffineTransformRotate(transform, M_PI/2.0); 
break; 

default: 
[NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; 

} 

UIGraphicsBeginImageContext(bounds.size); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { 
CGContextScaleCTM(context, -scaleRatio, scaleRatio); 
CGContextTranslateCTM(context, -height, 0); 
} 
else { 
CGContextScaleCTM(context, scaleRatio, -scaleRatio); 
CGContextTranslateCTM(context, 0, -height); 
} 

CGContextConcatCTM(context, transform); 

CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return imageCopy; 
} 
+0

최고 (이뿐만 아니라 스케일링 문제를 해결할 것입니다), 그 일을! 고마워요! –

+0

잘 작동합니다. 그러나 이미지를 확대 *하지 못하게하는 부분을 주석 처리했습니다. 메소드 서명에 관해서 불필요하다고 여겨지는 것은 확장이 가능하다는 것을 의미합니다. 그리고 당신이하고 싶은 것은 scale * down *입니다. CGImageSourceCreateThumbnailAtIndex는 아마도 좀 더 간결한 해결책 일 것입니다. – aroth