2013-06-26 32 views
1

我有一个图像的大小3264×2448和图像视图的大小768×1024。我想获得与视图大小相同的图像大小而不会损失图像质量。根据UIImageView大小调整UIImage大小而不会损失其质量在iOS中

我用Google搜索了它; AspectFit不给我适当的输出。我尝试下面的代码:

- (UIImage *)imageByScalingProportionallyToSize: (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; 
     else 
      scaleFactor = heightFactor; 

     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; 
     } 
    } 


    // this is actually the interesting part: 

    UIGraphicsBeginImageContext(targetSize); 

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

    [sourceImage drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

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


    return newImage ; 
} 
+1

为什么不分配'imageView.image = theImage;'?它会照顾调整... – 2013-06-26 12:15:21

回答

0

请尝试以下代码:

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

    return newImage; 
} 

指定新的大小(768,1024),并通过您的原始图像,但要确保你的身高和原始图像的宽度之比应该是一样的转换后的图像比。

+0

你救了我的一天男人....它工作像魅力男人...真棒....非常感谢:) – Hrishikesh

+0

恭喜...有一个愉快的一天...... :) – sagarcool89

0

我用this文章作为我的一些项目的参考包括图像大小调整。 UIImage + Resize类别的效果非常好,除非重要的性能受到影响,直到创建了调整后的图像版本。

您可以在磁盘上缓存已调整大小的版本以避免将来再次调整大小。此外,我还没有尝试过,但您可以尝试在后台线程中调整图像大小以避免阻止用户界面。

+0

如何获取该文章的代码? – Hrishikesh

+0

有链接到文章中的代码,但这里是UIImage + Resize为了方便:http://vocaro.com/trevor/blog/wp-content/uploads/2009/10/UIImage+Resize.h http:// vocaro .com/trevor/blog/wp-content/uploads/2009/10/UIImage + Resize.m – basar

0

输入图像的尺寸不是您的UIImageView尺寸的倍数,这就是为什么aspectFit不会在这里工作(最有可能会在两侧留下空隙)。如果您使用scaleToFill,您的图像将翘曲,因为您的图像尺寸再次关闭。我认为你必须对其中一个尺寸做些修改才能正确保存图像。

+0

是的,我同意你的意见。所以我正在努力为uiimage取得比例。这是正确的吗? – Hrishikesh

+0

是的,这是正确的 – Fonix