簡體   English   中英

如何獲得 UIImage 中像素的顏色?

[英]How do I get the color of a pixel in a UIImage?

所以我正在嘗試制作一個程序,讓我在其中拍照並告訴用戶顏色是什么。 我在實現 func getPixelColor 的部分時遇到了麻煩。 誰能給我一些關於如何將這個程序融合在一起的提示?

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var cameraButton: UIButton!
@IBOutlet weak var cameraView: UIImageView!
@IBOutlet weak var photosButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

@IBAction func tappedCameraButton(_ sender: Any) {
    let picker = UIImagePickerController()
    picker.sourceType = .camera
    picker.allowsEditing = true
    picker.delegate = self
    present(picker, animated: true)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
    cameraView?.image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
    picker.dismiss(animated: true, completion: nil)
}
extension UIImage {
    func getPixelColor(pos: CGPoint) -> UIColor {

        let pixelData = self.cgImage!.dataProvider!.data
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

        let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

        let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
        let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
        let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
        let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

        return UIColor(red: r, green: g, blue: b, alpha: a)
    }

}

}

}

您需要獲取用戶觸摸的CGPoint ,然后使用getPixelColor(pos:)來獲取顏色。

CGPoint有兩種獲取方式

  1. 您可以使用任何方法來獲取位置touchesBegan(_:with:)、touchesMoved、touchesEnded

  2. 使用點擊手勢

這是獲取CGPoint的 StackOverlow 代碼:如何從點擊的位置獲取 CGPoint?

extension UIImage {
     func getPixelColor(pos: CGPoint) -> UIColor? {
        
        guard let cgImg = cgImage, let provider = cgImg.dataProvider else {
            return nil
        }
        let pixelData = provider.data
        
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

        let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

        let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
        let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
        let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
        let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
        return UIColor(red: r, green: g, blue: b, alpha: a)
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM