【问题标题】:Is it possible to resize a UIImage without losing quality?是否可以在不损失质量的情况下调整 UIImage 的大小?
【发布时间】: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 - 是的,我刚刚检查过,我假设您的意思是帧比例与初始图像比例。它们是一样的。

标签: iphone ios cocoa-touch graphics core-graphics


【解决方案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 行。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 2012-02-13
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
相关资源
最近更新 更多