【问题标题】:Resizing Images using Core Graphics / Quartz 2D in Swift在 Swift 中使用 Core Graphics / Quartz 2D 调整图像大小
【发布时间】:2015-11-11 06:43:13
【问题描述】:

我想使用 Core Graphics 来调整一些图像的大小,因为我有一个图像重的应用程序。我在下面使用这种方法:

func createContext(image: UIImage) -> UIImage? {
    let cgImage = image.CGImage

    let width = Int(image.size.width)
    let height = Int(image.size.height)
    let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
    let bytesPerRow = CGImageGetBytesPerRow(cgImage)
    let colorSpace = CGImageGetColorSpace(cgImage)
    let bitmapInfo = CGImageGetBitmapInfo(cgImage)

    let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo.rawValue)

    CGContextSetInterpolationQuality(context, .High)

    CGContextDrawImage(context, CGRect(origin: CGPointZero, size: CGSize(width: image.size.width, height: image.size.height)), cgImage)

    let scaledImage = CGBitmapContextCreateImage(context).flatMap { UIImage(CGImage: $0) }

    return scaledImage
}

返回的图像在横向图像上看起来很棒,但对于纵向图像,它看起来像这样:

我可以更改代码以引入 UIKit 元素:

func createContext(image: UIImage) -> UIImage? {
    let cgImage = image.CGImage
    let rect = CGRectMake(0, 0, image.size.width, image.size.height)

    let size = image.size
    let scale: CGFloat = 0.0
    let width = CGImageGetWidth(cgImage) / 2
    let height = CGImageGetHeight(cgImage) / 2
    let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
    let bytesPerRow = CGImageGetBytesPerRow(cgImage)
    let colorSpace = CGImageGetColorSpace(cgImage)
    let bitmapInfo = CGImageGetBitmapInfo(cgImage)

    UIGraphicsBeginImageContextWithOptions(size, false, scale)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo.rawValue)

    CGContextSetInterpolationQuality(context, .High)
    let myGeneratedImage = CGBitmapContextCreateImage(context)

    CGContextDrawImage(context, rect, myGeneratedImage)

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return scaledImage
}

它看起来像这样,这就是我想要的。

但是,我想尽我所能避免引入 UIKit 并通过仅使用 Core Graphics 来保持代码较低级别,有人可以指出我做错了什么吗?如果您能看到我的错误,请随时用 objC 或 Swift 代码回复。

【问题讨论】:

    标签: ios objective-c image swift core-graphics


    【解决方案1】:

    解决办法如下:

    func fixOrientation() -> UIImage {
        if imageOrientation == .Up {
            return self
        }
    
        var transform = CGAffineTransformIdentity
    
        switch imageOrientation {
        case .Down, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, size.width, size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
        case .Left, .LeftMirrored:
            transform = CGAffineTransformTranslate(transform, size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
        case .Right, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, size.height)
            transform = CGAffineTransformRotate(transform, -CGFloat(M_PI_2))
        case .Up, .UpMirrored:
            break
        }
    
        switch imageOrientation {
        case .UpMirrored, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
        case .LeftMirrored, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, size.height, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
        case .Up, .Down, .Left, .Right:
            break
        }
    
        let context = CGBitmapContextCreate(nil, Int(size.width), Int(size.height), CGImageGetBitsPerComponent(CGImage), 0, CGImageGetColorSpace(CGImage), CGImageGetBitmapInfo(CGImage).rawValue)
        CGContextConcatCTM(context, transform)
    
        switch imageOrientation {
        case .Left, .LeftMirrored, .Right, .RightMirrored:
            CGContextDrawImage(context, CGRectMake(0, 0, size.height, size.width), CGImage)
        default:
            CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), CGImage)
            break
        }
    
        guard let cgImage = CGBitmapContextCreateImage(context) else {
             return UIImage()
        }
        let image = UIImage(CGImage: cgImage)
    
        return image
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2011-02-19
      • 2015-09-27
      相关资源
      最近更新 更多