#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 различными цветами и убедиться, что вы можете сначала получить правильные цвета, а затем обобщить свое решение.