前提・実現したいこと
ネット上のサンプルコードを使って、画像のタップした場所の
RGB値を取得するアプリを試しているのですが、
うまくいきません。
発生している問題・エラーメッセージ
画像を読み込んで任意の場所をタップしても
その場所の色と違う数値がでてしまいます。
storyubord上で配置したprintlabelでRGBの数値の表示を、
clorviewでその色のUIViewを表示するようにしています。
該当のソースコード
swift5.1.3
1 2import UIKit 3 4class TapViewController: UIViewController { 5 6 7 @IBOutlet var imageView: UIImageView! 8 @IBOutlet var printlabel: UILabel! 9 @IBOutlet var clorview: UIView! 10 11 var image = UIImage() 12 //表示されている画像のタップ座標用変数 13 var tapPoint = CGPoint(x: 0, y: 0) 14 15 override func viewDidLoad() { 16 } 17 18 override func didReceiveMemoryWarning() { 19 super.didReceiveMemoryWarning() 20 // Dispose of any resources that can be recreated. 21 } 22 23 //imageviewをタップした時に色を判別 24 @IBAction func getImageRGB(_ sender: UITapGestureRecognizer) { 25 26 guard imageView.image != nil else {return} 27 28 //タップした座標の取得 29 tapPoint = sender.location(in: imageView) 30 31 let cgImage = imageView.image?.cgImage! 32 let pixelData = cgImage?.dataProvider!.data 33 let data: UnsafePointer = CFDataGetBytePtr(pixelData) 34 //1ピクセルのバイト数 35 let bytesPerPixel = (cgImage?.bitsPerPixel)! / 8 36 //1ラインのバイト数 37 let bytesPerRow = (cgImage?.bytesPerRow)! 38 print("bytesPerPixel=(bytesPerPixel) bytesPerRow=(bytesPerRow)") 39 //タップした位置の座標にあたるアドレスを算出 40 let pixelAd: Int = Int(tapPoint.y) * bytesPerRow + Int(tapPoint.x) * bytesPerPixel 41 //それぞれRGBAの値をとる 42 let r = CGFloat(Int( CGFloat(data[pixelAd])))///CGFloat(255.0)*100)) / 100 43 let g = CGFloat(Int( CGFloat(data[pixelAd+1])))///CGFloat(255.0)*100)) / 100 44 let b = CGFloat(Int( CGFloat(data[pixelAd+2])))///CGFloat(255.0)*100)) / 100 45 let a = CGFloat(Int( CGFloat(data[pixelAd+3])/CGFloat(255.0)*100)) / 100 46 47 print([r,g,b,a]) 48 //navigationbarに結果を表示 49 let R = "R:" + String(Int(r)) 50 let G = " G:" + String(Int(g)) 51 let B = " B:" + String(Int(b)) 52 let A = " A:" + String(format: "%.1f", a) 53 navigationItem.title = R + G + B + A 54 55 printlabel.text = "([r,g,b,a])" 56 57 clorview.backgroundColor = UIColor(red: CGFloat(r / 255), green: CGFloat(g/255), blue: CGFloat(b/255), alpha: 1.0) 58 } 59} 60 61 62//画像を選択 63extension TapViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 64 65 //画像を選んだ時の処理 66 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 67 68 let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 69 //サイズを圧縮する 70 // let resizedImage = selectedImage.scale(byFactor: 0.4) 71 72 image = selectedImage 73 74 var imageHeight = image.size.height 75 var imageWidth = image.size.width 76 77 let navigationBarHeight = navigationController?.navigationBar.frame.height 78 let width = self.view.frame.width 79 let height = self.view.frame.height 80 let centerX = self.view.center.x 81 let centerY = self.view.center.y 82 let widthRatio = imageWidth 83 let heightRatio = imageHeight 84 //画像の大きさに応じてiamgeviewのサイズを変える 85 if imageHeight > self.view.frame.height || imageWidth > self.view.frame.width { 86 print("1") 87 imageWidth = width 88 imageHeight = width*heightRatio/widthRatio 89 90 } else if imageHeight > self.view.frame.height { 91 print("2") 92 imageHeight = height 93 imageWidth = height*widthRatio/heightRatio 94 95 } else if imageWidth > self.view.frame.width { 96 print("3") 97 imageWidth = width 98 imageHeight = width*heightRatio/widthRatio 99 100 } else { 101 } 102 103 imageView.contentMode = UIViewContentMode.scaleAspectFill 104 imageView.frame.size = CGSize(width: imageWidth, height: imageHeight) 105 //画像がnavigationbarに被らないようにする 106 if imageHeight/2 > (height/2 - navigationBarHeight!) { 107 print("4") 108 imageView.center = CGPoint(x: centerX, y: centerY + navigationBarHeight!) 109 } else { 110 print("5") 111 imageView.center = CGPoint(x: centerX, y: centerY) 112 } 113 114 imageView.image = image 115 116 picker.dismiss(animated: true, completion: nil) 117 } 118 119 120 121 // 撮影がキャンセルされた時に呼ばれる 122 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 123 picker.dismiss(animated: true, completion: nil) 124 } 125 126 func tappedlibrary() { 127 let sourceType:UIImagePickerControllerSourceType = 128 UIImagePickerControllerSourceType.photoLibrary 129 130 if UIImagePickerController.isSourceTypeAvailable( 131 UIImagePickerControllerSourceType.photoLibrary){ 132 // インスタンスの作成 133 let cameraPicker = UIImagePickerController() 134 cameraPicker.sourceType = sourceType 135 cameraPicker.delegate = self 136 self.present(cameraPicker, animated: true, completion: nil) 137 } 138 else{ 139 print("error") 140 141 } 142 } 143 144 func tappedcamera() { 145 let sourceType:UIImagePickerControllerSourceType = 146 UIImagePickerControllerSourceType.camera 147 // カメラが利用可能かチェック 148 if UIImagePickerController.isSourceTypeAvailable( 149 UIImagePickerControllerSourceType.camera){ 150 // インスタンスの作成 151 let cameraPicker = UIImagePickerController() 152 cameraPicker.sourceType = sourceType 153 cameraPicker.delegate = self 154 self.present(cameraPicker, animated: true, completion: nil) 155 156 } 157 else{ 158 print("error") 159 } 160 } 161 162 @IBAction func selecteImageButton(_ sender: UITapGestureRecognizer) { 163 //アラート表示のために 164 let actionSheet = UIAlertController(title: "", message: "写真の選択", preferredStyle: UIAlertControllerStyle.actionSheet) 165 166 let tappedcamera = UIAlertAction(title: "カメラで撮影する", style: UIAlertActionStyle.default, handler: { 167 (action: UIAlertAction!) in 168 self.tappedcamera() 169 }) 170 171 let tappedlibrary = UIAlertAction(title: "ライブラリから選択する", style: UIAlertActionStyle.default, handler: { 172 (action: UIAlertAction!) in 173 self.tappedlibrary() 174 }) 175 176 let cancel = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.cancel, handler: { 177 (action: UIAlertAction!) in 178 print("キャンセル") 179 }) 180 181 actionSheet.addAction(tappedcamera) 182 actionSheet.addAction(tappedlibrary) 183 actionSheet.addAction(cancel) 184 185 present(actionSheet, animated: true, completion: nil) 186 } 187 188} 189 190
補足情報(FW/ツールのバージョンなど)
Xcode 11.3.1
テスト実機 iPhone11 iOS 13.4.1
参考にされた記事のURLもご質問に追記していただけないでしょうか。
ちなみに、ピクセルの情報を取得する際、アルファ値のみ正規化しているように見えますが、それ以外の値を正規化しない理由はなにかあるのでしょうか。
参考にしたのはこちらになります。
https://qiita.com/panzee54/items/89d94f5cffd92358fce3
すみません、試してみて思うように動かなかったので、
アルファ値のみ1.0にしてみて、そのままになっていました。
UIViewは色を見るために自分で付け加えたもので、
変なコードを書いてしまっているかもしれません。
参考URLのものをそのままで動かしてもなぜか正しい色の数値が
出てきませんでした。
回答1件
あなたの回答
tips
プレビュー