Невозможно вернуть цвета RGB (CGPoint, CGImage)

#ios #swift #xcode

#iOS #swift #xcode

Вопрос:

Программа запускается, но, к сожалению, я не могу понять, почему она не возвращает RGB. Может ли кто-нибудь сказать мне, что может быть не так? Перекрестие (CGPoint) перемещается по изображению, снятому с камеры, и показывает, что жесты работают на консоли Xcode, но RGB не возвращается успешно.

Я не могу понять, в чем может быть проблема с моим кодом:

 import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    @IBOutlet weak var cameraButton: UIButton!
    @IBOutlet weak var cameraView: UIImageView!
    @IBOutlet weak var photosButton: UIButton!
    @IBOutlet weak var crosshair: UIImageView!
    var cameraView2: CGImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        addPanGesture(view: crosshair)
        //crosshair.layer.position = CGPoint(x: 5, y: 5)
        crosshair2 = crosshair.frame.origin
        print("viewDidLoad")
        view.bringSubviewToFront(crosshair)
      }
    
    var crosshair2: CGPoint!
      
      func addPanGesture(view: UIImageView) {
          let pan = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePan(sender:)))
          view.addGestureRecognizer(pan)
          print("addPanGesture")
      }
      
      // Refactor
      @objc func handlePan(sender: UIPanGestureRecognizer) {
          print("handlePan")
          let fileView = sender.view!
          switch sender.state {
          case .began, .changed:
              moveViewWithPan(view: fileView, sender: sender)
          default:
              break
          }
      }
      
      func moveViewWithPan(view: UIView, sender: UIPanGestureRecognizer) {
          let translation = sender.translation(in: view)
          view.center = CGPoint(x: view.center.x   translation.x, y: view.center.y   translation.y)
          sender.setTranslation(CGPoint.zero, in: view)
          print("moveViewWithPan")
      }
    
    @IBAction func tappedCameraButton(_ sender: Any) {
        let cam = UIImagePickerController()
        cam.sourceType = .camera
        cam.allowsEditing = true
        cam.delegate = self
        present(cam, animated: true)
        print("tappedCameraButton")
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        cameraView?.image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
        picker.dismiss(animated: true, completion: nil)
        print("imagePickerController")
    }
    
//extension UIImageView {
    func getPixelColor(pos: CGPoint) -> UIColor? {
        cameraView2 = cameraView.image?.cgImage
        guard let cgImage = cameraView2, let provider = cgImage.dataProvider
        else {
            return nil
        }
        let pixelData = provider.data
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
        let screenWidth  = UIScreen.main.fixedCoordinateSpace.bounds.width
        let pixelInfo: Int = ((Int (screenWidth) * 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)
        let color = UIColor(red: r, green: g, blue: b, alpha: a)
                return(color)
    }
}
 

Он запускается, но отображает ошибку в консоли, когда я открываю камеру со словами:

 2021-01-13 21:01:25.113734-0500 RGB Returner[17055:4324721] [Camera] Failed to read exposureBiasesByMode dictionary: Error Domain=NSCocoaErrorDomain Code=4864 "*** -[NSKeyedUnarchiver _initForReadingFromData:error:throwLegacyExceptions:]: data is NULL" UserInfo={NSDebugDescription=*** -[NSKeyedUnarchiver _initForReadingFromData:error:throwLegacyExceptions:]: data is NULL}
 

Ответ №1:

Ваша математика отключена по нескольким причинам. Во-первых, iOS отображает в точках, а не в пикселях. Поэтому, когда вы запрашиваете UIScreen его размер, он дает вам очки, в то время как ваше изображение в пикселях. См. UIScreen.main.scale о том, как преобразовать. Во-вторых, если вы не гарантируете, что ваше изображение (не ваш вид изображения, а фактическое изображение внутри него) имеет точно такой же размер, что и экран, вам необходимо скрыть точки в пространстве изображения. Также CoreGraphics использует декартовы координаты (up — положительный Y), в то время как UIKit использует обратный декартов (положительный Y — отрицательный). В-третьих, высота тона для каждой строки в изображении не всегда находится на 32-битной границе (обычно это так, но вы не должны предполагать этого. используйте свойство bitmapInfo, чтобы определить количество байтов в строке. Учитывая, насколько все это сложно, я предлагаю вам начать с очень простого 4-пиксельного изображения с 4 различными цветами и убедиться, что вы можете сначала получить правильные цвета, а затем обобщить свое решение.