首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为ColorPicker生成UIImage (CGDataProvider和CGImageSource)

为ColorPicker生成UIImage (CGDataProvider和CGImageSource)
EN

Stack Overflow用户
提问于 2017-01-28 00:51:27
回答 1查看 262关注 0票数 0

伙计们,我是新手在快速和编程,我想生成一个图像显示为一个ColorPicker我使用SwiftColorPicker为这一点,并有以下的图像创建代码:

代码语言:javascript
复制
 private func createImageFromData(_ width:Int, height:Int) {
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue)
    provider = CGDataProvider(data: mutableData)
    imageSource = CGImageSourceCreateWithDataProvider(provider, nil)
    let cgImage = CGImage.init(width: width, height: height, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: width * 4, space: colorSpace, bitmapInfo: bitmapInfo, provider: provider, decode: nil, shouldInterpolate: true, intent: .defaultIntent)

    if let cgimg = cgImage {
        image = UIImage(cgImage: cgimg)

            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAsset(from: self.image!)
            }, completionHandler: { success, error in
                if success {
                    print("succes")
                }
                else if let error = error {
                    print("error")
                    debugPrint(error as Any)
                }
                else {
                    print("woooot?")
                }
            })


    } else { print("Where the hell is the image?") }
}


func changeSize(_ width:Int, height:Int) {
    self.width = width
    self.height = height
    let size:Int = width * height * 4
    CFDataSetLength(mutableData, size)
    createImageFromData(width, height: height)
}

init(width:Int, height:Int) {
    self.width = width
    self.height = height
    let size:Int = width * height * 4
    mutableData = CFDataCreateMutable(kCFAllocatorDefault, size)
    createImageFromData(width, height: height)
}

public func writeColorData(_ h:CGFloat, a:CGFloat) {

    let d = CFDataGetMutableBytePtr(self.mutableData)

    if width == 0 || height == 0 {
        return
    }

    var i:Int = 0
    let h360:CGFloat = ((h == 1 ? 0 : h) * 360) / 60.0
    let sector:Int = Int(floor(h360))
    let f:CGFloat = h360 - CGFloat(sector)
    let f1:CGFloat = 1.0 - f
    var p:CGFloat = 0.0
    var q:CGFloat = 0.0
    var t:CGFloat = 0.0
    let sd:CGFloat = 1.0 / CGFloat(width)
    let vd:CGFloat =  1 / CGFloat(height)

    var double_s:CGFloat = 0
    var pf:CGFloat = 0
    let v_range = 0..<height
    let s_range = 0..<width

    for v in v_range {
        pf = 255 * CGFloat(v) * vd
        for s in s_range {
            i = (v * width + s) * 4
            d?[i] = UInt8(255)
            if s == 0 {
                q = pf
                d?[i+1] = UInt8(q)
                d?[i+2] = UInt8(q)
                d?[i+3] = UInt8(q)
                continue
            }

            double_s = CGFloat(s) * sd
            p = pf * (1.0 - double_s)
            q = pf * (1.0 - double_s * f)
            t = pf * ( 1.0 - double_s  * f1)
            switch(sector) {
            case 0:
                d?[i+1] = UInt8(pf)
                d?[i+2] = UInt8(t)
                d?[i+3] = UInt8(p)
            case 1:
                d?[i+1] = UInt8(q)
                d?[i+2] = UInt8(pf)
                d?[i+3] = UInt8(p)
            case 2:
                d?[i+1] = UInt8(p)
                d?[i+2] = UInt8(pf)
                d?[i+3] = UInt8(t)
            case 3:
                d?[i+1] = UInt8(p)
                d?[i+2] = UInt8(q)
                d?[i+3] = UInt8(pf)
            case 4:
                d?[i+1] = UInt8(t)
                d?[i+2] = UInt8(p)
                d?[i+3] = UInt8(pf)
            default:
                d?[i+1] = UInt8(pf)
                d?[i+2] = UInt8(p)
                d?[i+3] = UInt8(q)
            }


        }
    }
}

和:

代码语言:javascript
复制
    // Write colors to data array
        if self.data1Shown { self.pickerImage2!.writeColorData(self.h, a:self.a) }
        else { self.pickerImage1!.writeColorData(self.h, a:self.a)}

通过以下方式:

代码语言:javascript
复制
  public var a:CGFloat = 1 {
    didSet {
        if a < 0 || a > 1 {
            a = max(0, min(1, a))
        }
    }
}

public var h:CGFloat = 0 { // // [0,1]
    didSet {
        if h > 1 || h < 0 {
            h = max(0, min(1, h))
        }
        renderBitmap()
        setNeedsDisplay()
    }

}

当我尝试将它保存到相册时,它失败了(我已经这样做了,因为我无法设置图像,所以我试图保存它,以了解它是否正确或这是一个错误),瞧!出现一个优雅的错误:

错误Domain=NSCocoaErrorDomain代码=-1“(空)”

所以我想知道也许有人知道该怎么做,我如何解决这个问题,这里是gitHub上的源码链接(也许它会有所帮助):

https://github.com/MrMatthias/SwiftColorPicker

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-01-28 01:26:38

我做了一个有用的快速扩展来创建纯色的UIImage

请随意使用它:

代码语言:javascript
复制
extension UIImage {

    static func image(of color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

        color.set()
        UIRectFill(CGRect(origin: CGPoint.zero, size: size))

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }

}

然后,您可以通过以下方式使用它:

代码语言:javascript
复制
let redImage = UIImage.image(of: .red, size: CGSize(width: 200, height: 200))

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41899050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档