【问题标题】:Adjust UIImage size as per UIImageView size without losing its quality in iOS根据 UIImageView 大小调整 UIImage 大小而不会在 iOS 中失去其质量
【发布时间】:2013-06-26 12:11:35
【问题描述】:

我有一个尺寸为 3264 × 2448 的图像和一个尺寸为 768 × 1024 的图像视图。我希望在不损失图像质量的情况下获得与视图大小相等的图像大小。

我用谷歌搜索了它; 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 ;
}

【问题讨论】:

  • 你为什么不直接分配imageView.image = theImage;?它将负责调整大小...

标签: iphone objective-c ios6 uiimageview uiimage


【解决方案1】:

请尝试以下代码:

+ (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) 并传递您的原始图像,但请确保您的原始图像的高度和宽度比例应与转换后的图像比例相同。

【讨论】:

  • 恭喜...祝您有美好的一天...:)
【解决方案2】:

我使用this 文章作为我的一些项目的参考,包括图像大小调整。 UIImage+Resize 类别效果很好,除了在创建调整大小的图像版本之前对性能造成重大影响。

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

【讨论】:

【解决方案3】:

输入图像的尺寸不是UIImageView 尺寸的倍数,这就是为什么 aspectFit 不能在这里工作的原因(很可能会在两侧留下间隙)。如果您使用 scaleToFill,您的图像会变形,因为您的图像尺寸再次关闭。我认为您必须对其中一个的尺寸做一些事情才能正确保存图像。

【讨论】:

  • 是的,我同意你的看法。所以我试图获得uiimage的比率。对吗?
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多