UIImagePickerController图像大小

时间:2011-07-04 14:48:53

标签: iphone uiimagepickercontroller

我在我的应用程序中使用UIImagePickerController来拍照并且我正在使用我自己的控件,这意味着UIImagePickerController showsCameraControls属性设置为NO并且我在overlayView中有一个UIButton来拍摄照片。现在,我注意到我在照片库中保存的图像实际上显示的区域比预览视图中显示的图像更大。还有其他人有同样的问题吗?是什么解决方案让图片显示预览中的内容?

2 个答案:

答案 0 :(得分:2)

从拾取器获取图像对象后,调整图像大小然后裁剪

我需要同样的东西 - 在我的情况下,选择适合缩放的尺寸,然后裁剪每一端以使其余部分适合宽度。 (我在横向工作,所以可能没有注意到肖像模式的任何缺陷。)这是我的代码 - 它是UIImage的一个类似的一部分。我的代码中的目标大小始终设置为设备的全屏大小。

@implementation UIImage (Extras)

#pragma mark -
#pragma mark Scale and crop image

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
UIImage *sourceImage = self;
UIImage *newImage = nil;    
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

if (CGSizeEqualToSize(imageSize, targetSize) == NO) 
    {
    CGFloat widthFactor = targetWidth / width;
    CGFloat heightFactor = targetHeight / height;

    if (widthFactor > heightFactor) 
        scaleFactor = widthFactor; // scale to fit height
    else
        scaleFactor = heightFactor; // scale to fit width
    scaledWidth  = width * scaleFactor;
    scaledHeight = height * scaleFactor;

    // center the image
    if (widthFactor > heightFactor)
        {
        thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        }
    else 
        if (widthFactor < heightFactor)
            {
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
            }
    }   

UIGraphicsBeginImageContext(targetSize); // this will crop

CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width  = scaledWidth;
thumbnailRect.size.height = scaledHeight;

[sourceImage drawInRect:thumbnailRect];

newImage = UIGraphicsGetImageFromCurrentImageContext();
if(newImage == nil) 
    NSLog(@"could not scale image");

//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}

答案 1 :(得分:1)

通过预览,我假设您正在谈论图像选择器界面(而不是在解除图像选择器界面后出现的默认预览屏幕)。

您应用于图像选取器界面的变换(使用cameraViewTransform)不会反映拍摄的图像。例如,如果您尝试缩放(进出)应用缩放,则需要对获得的图像应用相同的(变换),以使图像保持图像在图像选取器界面和实际保存的图像中保持同步。
此外,在应用变换时,您还必须考虑图像方向。