如何获取 UIImage 中像素的颜色?

Posted

技术标签:

【中文标题】如何获取 UIImage 中像素的颜色?【英文标题】:How do I get the color of a pixel in a UIImage? 【发布时间】:2021-01-06 00:06:02 【问题描述】:

所以我正在尝试制作一个程序,让我在其中拍照并告诉用户颜色是什么。我在实现 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)
    




【问题讨论】:

请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work? 【参考方案1】:

你需要获取用户触摸的CGPoint,然后使用getPixelColor(pos:)获取颜色。

有两种方式获取CGPoint

    您可以使用任何一种方法来获取位置touchesBegan(_:with:), touchesMoved, touchesEnded

    使用点击手势

这是获取CGPoint的StackOverlow代码:How to get a CGPoint from a tapped location?

【讨论】:

您需要在显示图像的那个 vc 中实现这些方法【参考方案2】:
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)
     
 

【讨论】:

以上是关于如何获取 UIImage 中像素的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 转换为 CGImage 以获取像素颜色

从格式不受支持的 UIImage 中获取像素数据?

如何从 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 获取像素数据?

快速高效地获取屏幕(视图)黑色像素

如何绘制不同颜色的填充路径/形状

如何更改UIImage / UIImageView的单个像素的颜色