CreateIplImageFromUIImage、UIImageFromIplImage
你上网搜索到的都是一样的,就认为是原版把。但是原版的CreateIplImageFromUIImage有个问题:
当你是处理非直接IOS摄像头采集到的图像时,没得问题(我测试的前提是这个图像是正方形的,Size:640*640)。
但是当你采集的图片是前置摄像头(我只需要用前置,所以只测试了前置的)一个正方形的时候,比如
Size: 640*640 那么基本没得什么大碍,只不过图片会被旋转90度。
问题就来了,我采集的是480*640的图片,最后得到的结果图片不止被旋转了90度,而且图像都变形了,比如人脸被压扁了···那要做人脸识别就蛋疼了···我可没得外星人的数据库···
于是搜索了下,在 http://stackoverflow.com/
看到了相关的提问,后面自己也解决了,顺便也回复了下。代码也是网上看到的,共享、记录下。
可以去这里去复制,看起来比这博客看的舒服点把。
http://stackoverflow.com/questions/4263365/iphone-converting-iplimage-to-uiimage-and-back-causes-rotation/10663685#10663685
对于 CreateIplImageFromUIImage
进行修改如下:
- (IplImage*)CreateIplImageFromUIImage:(UIImage*)image{CGImageRefimageRef=[selfrotateImage:image].CGImage;...........}
- (UIImage* )rotateImage:(UIImage
*)image {
int
kMaxResolution = 320;
// Or
whatever
CGImageRef
imgRef = image.CGImage;
CGFloat width
= CGImageGetWidth(imgRef);
CGFloat
height = CGImageGetHeight(imgRef);
CGAffineTransform transform =
CGAffineTransformIdentity;
CGRect bounds
= CGRectMake(0, 0, width,
height);
if (width
> kMaxResolution || height >
kMaxResolution) {
CGFloat ratio =
width / height;
if (ratio >
1 ) {
bounds.size.width = kMaxResolution;
bounds.size.height =
bounds.size.width / ratio;
}
else {
bounds.size.height = kMaxResolution;
bounds.size.width =
bounds.size.height * ratio;
}
}
CGFloat
scaleRatio = bounds.size.width /
width;
CGSize
imageSize =
CGSizeMake(CGImageGetWidth(imgRef),
CGImageGetHeight(imgRef));
CGFloat
boundHeight;
UIImageOrientation orient =
image.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;
}