【问题标题】:UIImage aspect fillUIImage 方面填充
【发布时间】:2018-05-02 09:06:09
【问题描述】:

我正在尝试在 UIImage 上执行方面填充(带有可重复使用的扩展),但我只做到了这一点:

extension UIImage {
    func resizeToCircleImage(targetSize: CGSize, contentMode: UIViewContentMode) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(targetSize, true, 0.0)
        let rect = CGRect(x: 0, y: 0, width: targetSize.width, height: targetSize.height)
        self.draw(in: rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

所以,这是一个 MKAnnotationView。

它最终看起来像这样:

但我想调整此图像的纵横比:

https://en.wikipedia.org/wiki/Panorama#/media/File:Panorama_of_the_courtyard_of_the_Great_Mosque_of_Kairouan.jpg

【问题讨论】:

  • 你能解释一下预期的结果是什么,目前的结果是什么?屏幕截图可能会有所帮助
  • 您说您正在尝试在 uiimage 上进行纵横比填充,但您希望纵横比适合。嗯。怎么回事?!?!
  • 我猜两者都行。如果我知道一种方法,我应该能够适应另一种方法。希望我没那么笨。

标签: ios swift uiimage core-graphics


【解决方案1】:

考虑UIImage的一个类别,

- (UIImage *)aspectFillToSize:(CGSize)size
{
    CGFloat imgAspect = self.size.width / self.size.height;
    CGFloat sizeAspect = size.width/size.height;

    CGSize scaledSize;

        if (sizeAspect > imgAspect) { // increase width, crop height
            scaledSize = CGSizeMake(size.width, size.width / imgAspect);
        } else { // increase height, crop width
            scaledSize = CGSizeMake(size.height * imgAspect, size.height);
        }
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
    [self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

【讨论】:

    【解决方案2】:

    “karim”代码的 Swift 扩展版本:

    private extension UIImage {
    
        func resize(to newSize: CGSize) -> UIImage? {
            guard size != newSize else {
                return self
            }
            let imgAspect = size.width/size.height
            let sizeAspect = newSize.width/newSize.height
    
            let scaledSize: CGSize
            if sizeAspect > imgAspect {
                scaledSize = CGSize(width: newSize.width, height: newSize.width/imgAspect)
            } else {
                scaledSize = CGSize(width: newSize.height * imgAspect, height: newSize.height)
            }
    
            UIGraphicsBeginImageContextWithOptions(newSize, true, 1.0)
            defer { UIGraphicsEndImageContext() }
    
            let context = UIGraphicsGetCurrentContext()
            guard let context = context else {
                return nil
            }
            context.clip(to: CGRect(origin: .zero, size: newSize))
            draw(in: CGRect(origin: .zero, size: scaledSize))
    
            return UIGraphicsGetImageFromCurrentImageContext()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2017-09-28
      • 2021-08-04
      • 2013-11-25
      相关资源
      最近更新 更多