iphone全屏调整大小的图像预览

时间:2011-09-13 04:08:26

标签: iphone

我的UIImageview视图宽度为75,高度为75.我从相机或照片库中捕获图像,调整大小并设置为imageview。

将捕获的图像上传到服务器,但上传已调整大小的图像并丢失图像质量。从服务器检索时会查看模糊图像。

现在,我需要的是,每当我点击imageview时,都应该显示全屏图像预览,并且应该上传高质量的图像而不是调整大小的图像

我使用以下代码重新调整了图像

- (UIImage*)imageWithImage:(UIImage*)sourceImage scaledToSize:(CGSize)newSize;
{
    CGFloat targetWidth = newSize.width;
    CGFloat targetHeight = newSize.height;

    NSLog(@"target Width:%f",targetWidth);
    NSLog(@"target Height:%f",targetHeight);

    CGImageRef imageRef = [sourceImage CGImage];
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
    CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);

    if (bitmapInfo == kCGImageAlphaNone) {
        bitmapInfo = kCGImageAlphaPremultipliedLast;
    }

    CGContextRef bitmap;

    if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {
        bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

        NSLog(@"ImageOrientation UP/DOWN");

    } else {
        bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    }   

    if (sourceImage.imageOrientation == UIImageOrientationLeft) {
        NSLog(@"ImageOrientation LEFT");

        CGContextRotateCTM (bitmap, radians(90));
        CGContextTranslateCTM (bitmap, 0, -targetHeight);

    } else if (sourceImage.imageOrientation == UIImageOrientationRight) {
        NSLog(@"ImageOrientation RIGHT");
        CGContextRotateCTM (bitmap, radians(-90));
        CGContextTranslateCTM (bitmap, -targetWidth, 0);

    } else if (sourceImage.imageOrientation == UIImageOrientationUp) {
        NSLog(@"ImageOrientation UP/DOWN");
        // NOTHING
    } else if (sourceImage.imageOrientation == UIImageOrientationDown) {
        CGContextTranslateCTM (bitmap, targetWidth, targetHeight);
        CGContextRotateCTM (bitmap, radians(-180.));
    }

    // CGContextSetInterpolationQuality(bitmap, 1);

    CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage* newImage = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);
    CGImageRelease(ref);

    return newImage; 
}

请帮帮我

2 个答案:

答案 0 :(得分:0)

将图像调整到75x75后,质量会丢失 - 向上调整大小不会恢复它。因此,您必须保留对原始未显示图像的引用以传递以上载到服务器。您可以保留两份副本 - 手动调整大小的副本和上传的原始副本,并在完整大小的视图中使用后者。

但是,正如robin在上面的评论中指出的那样,您可以使用UIImageView的内容模式让它根据内容模式自动调整视图中的图像。

您的情况的相关内容模式是:

UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFill,UIViewContentModeScaleAspectFit

这些都会导致图像在75x75 UIImageView

中调整大小

myImageView.contentMode = UIViewContentModeScaleAspectFit;
myImageView.image = myUnscaledImage;

ScaleToFill将拉伸您的图像,使其填满可用空间 - 即使这会扭曲它。

ScaleAspectFill将拉伸图像,使最短尺寸(宽度或高度)填充可用空间,并裁剪最长尺寸(宽度或高度)。

ScaleAspectFit将拉伸您的图像,使最长尺寸仍然适合可用空间,并在最短尺寸(水平或垂直)周围留出空白区域

UIViewContentModeScaleAspectFit似乎最有可能适合您的目标。

弹出全屏图像的一种方法是用透明按钮覆盖你的UIImageView,为触摸添加一个动作处理程序,在这个现在是一个模态视图控制器,它有一个图像视图,可以将你的完整图像设置为视图。或者,将图像视图子类化并添加自己的触摸处理或使用手势识别器而不是透明按钮。

如果全尺寸图像大于您的视图窗口并且您希望它可滚动,则将其放在滚动视图中。如果您希望它也可以缩放,则将其加载到Web视图中的img标记中,而不是使用滚动视图。

如果您希望显示器是临时的,请使用NSTimer并在弹出时间时关闭模式视图控制器,或者您可以监听上传http请求的结束并在图像上传完成后关闭完整大小的视图。

答案 1 :(得分:0)

您正在调整相同的图像大小,为什么不创建像这样缩小尺寸的新图像

+ (UIImage*)scaledImageForImage:(UIImage*)image newSize:(CGSize)newSize
{
    UIGraphicsBeginImageContext( newSize );
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}