2013-01-21 181 views
1

我的相机的自定义覆盖图仅在中心留下了320x320的正方形,因此用户只能拍摄屏幕上的图片。UIImagePickerController使用自定义覆盖图进行缩放和裁剪

我检索原始图片,然后我想缩小它并只裁剪叠加层上可见的区域。

我在使用iPhone5时遇到了问题。它适用于iPhone3gs,4和4s。

这是我已经使用到目前为止该方法:

-(UIImage *)squareImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
    double ratio; 
    double delta; 
    CGPoint offset; 

    //make a new square size, that is the resized imaged width 
    CGSize sz = CGSizeMake(newSize.width, newSize.width); 

    //figure out if the picture is landscape or portrait, then 
    //calculate scale factor and offset 
    if (image.size.width > image.size.height) { 
     ratio = newSize.width/image.size.width; 
     delta = (ratio*image.size.width - ratio*image.size.height); 
     offset = CGPointMake(delta/2, 0); 
    } else { 
     ratio = newSize.width/image.size.height; 
     delta = (ratio*image.size.height - ratio*image.size.width); 
     if (self.isPickingFromLibrary) { 
      offset = CGPointMake(0, delta/2); 
     } else { 
      // Add 25 for image offset 
      offset = CGPointMake(0, delta/2+25); 
     } 
    } 

    //make the final clipping rect based on the calculated values 
    CGRect clipRect = CGRectMake(-offset.x, -offset.y, 
           (ratio * image.size.width) + delta, 
           (ratio * image.size.height) + delta); 


    //start a new context, with scale factor 0.0 so retina displays get 
    //high quality image 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(sz, YES, 0.0); 
    } else { 
     UIGraphicsBeginImageContext(sz); 
    } 
    UIRectClip(clipRect); 
    [image drawInRect:clipRect]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

在iPhone5的运行该方法之后,图像被裁剪,并大幅度正确缩放。

我想为方形图像制作出像样的自定义相机,而且我一直在用这个撞击我的头几个星期。我甚至研究过使用AVFoundation,但我甚至不知道从哪里开始。

如果任何人都可以帮助我缩放和裁剪任何设备的uiimagepicker方形图像给我的图像矩形,我会很感激。

回答

0

如果你的设备是Retina显示屏,那么你应该使用这个代码调整图片的大小

-(BOOL)iPhoneRetina{ 
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; 

}

if([self iPhoneRetina]==TRUE){ 

    CGRect rect = CGRectMake(0, 0, point.origin.x, self.trackBackground.frame.size.height); 
    rect.size.height = rect.size.height * [_trackImage scale]; 
    rect.size.width = rect.size.width * [_trackImage scale]; 
    rect.origin.x = rect.origin.x * [_trackImage scale]; 
    rect.origin.y = rect.origin.y * [_trackImage scale]; 
    CGImageRef sourceImageRef = [_trackImage CGImage]; 
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect); 
    cropped = [UIImage imageWithCGImage:newImageRef scale:[_trackImage scale] orientation:[_trackImage imageOrientation]]; 

} 
else{ 
    imageRef = CGImageCreateWithImageInRect([_trackImage CGImage], CGRectMake(0, 0, point.origin.x, self.trackBackground.frame.size.height)); 
    cropped = [UIImage imageWithCGImage:imageRef]; 
} 

其中矩形是必须加以裁剪,然后将图像的矩形根据视网膜调整它的大小。