是否可以在不损失质量的情况下调整 UIImage 的大小?

Posted

技术标签:

【中文标题】是否可以在不损失质量的情况下调整 UIImage 的大小?【英文标题】:Is it possible to resize a UIImage without losing quality? 【发布时间】:2011-11-17 21:07:32 【问题描述】:

我有一个 UIImage,我把它放在一个 UIImageView 中,它附有一个捏手势识别器,我用它来缩放图像。当我在 UIImageView 中缩放图像时,没有失真并且可以完美缩放。但是,我需要在不在 UIImageView 中时调整 UIImage 的大小,并且当我使用以下代码执行此操作时,结果略有偏差:

CGFloat width = self.imageView.frame.size.width;
CGFloat height = self.imageView.frame.size.height;

UIGraphicsBeginImageContext(CGSizeMake(width, height));
[self.image drawInRect:CGRectMake(0, 0, width, height)];
UIImage *resizedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];    
UIGraphicsEndImageContext();

如您所见,我从 imageView 获取高度和宽度,因为这是图像需要缩放到的。

我知道如果 imageView 能够做到这一点,它必须可以完美地缩放它,有没有人碰巧知道我做错了什么?

更新:我附上了一张图片的前/后(已由用户在图像视图中重新缩放)以及使用上述方法调整大小后它的外观。

【问题讨论】:

您是否检查以确保帧中的值具有相同的比例? @Javy - 是的,我刚刚检查过,我假设您的意思是帧比例与初始图像比例。它们是一样的。 【参考方案1】:

试试这个:

+ (UIImage*)rescaleImage:(UIImage *)image scaledToSize:(CGRect)newSize 
    UIGraphicsBeginImageContext(newSize.size);
    [image drawInRect:newSize];
    UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resImage;

【讨论】:

你应该使用UIGraphicsBeginImageContextWithOptions。它需要一个 scale 参数,使其能够适应视网膜显示。 这会有什么不同呢?这与我上面发布的代码几乎完全相同。 不确定,但这段代码对我有用 - 没有歪斜。 @MarkAdams 同意,感谢您的提示。 在应用比例之前,您是否已从 UIImageView 中删除了 UIImage? @Javy 是的,我确实尝试过,但没有任何作用。【参考方案2】:

我遇到了同样的问题,我使用以下代码来帮助解决它:

    CGFloat scale = 1.0;
if([[UIScreen mainScreen]respondsToSelector:@selector(scale)])         
    CGFloat tmp = [[UIScreen mainScreen]scale];
    if (tmp > 1.5) 
        scale = 2.0;    
    
 

if(scale > 1.5) 
    UIGraphicsBeginImageContextWithOptions(targetSize, NO, scale);
 else 
    UIGraphicsBeginImageContext(targetSize);

【讨论】:

更好的解决方案可能是将 0.0 传递到比例尺中,因为该函数会自行从主屏幕插入比例尺。这会将上面的 12 行代码变成 1 行。

以上是关于是否可以在不损失质量的情况下调整 UIImage 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不损失视网膜显示质量的情况下将 UIView 捕获到 UIImage

在不损失任何质量的情况下调整图像大小[关闭]

python如何在不损失质量的情况下调整(缩小)图像的大小

如何在不损失图像质量的情况下调整图像大小以适合小型 HTML5 画布? [复制]

在 python 中放大 SVG 图像而不损失其质量

上传图片:在不损失质量的情况下降低分辨率(Swift)