質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1094閲覧

画面の色認識とその座標

destiny_

総合スコア4

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/11/29 07:53

画面をタップした際、表示させた画像のタップした位置のRGB値を取得するコードを書きました。
ここからこのコードを書き換えていって黒色の座標を取得できるようにしたいのですが、黒色の画用紙を写真とった場合、全体としてはもちろん黒に見えるのですがRBG値としては色々な色が混ざっていることになっています。このようになるのは理解できるのですが、全体として黒色であると判断して座標を取得する方法・案が浮かびません。
何か画期的な方法などありますか?

import UIKit import AVFoundation let pixelDataBytesSize = 4; class ViewController: UIViewController { @IBOutlet weak var myImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let sampleImage = UIImage(named: "sample.PNG") myImageView.image = sampleImage } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let presentedFrame = AVMakeRect(aspectRatio: (myImageView.image?.size)!, insideRect: myImageView.bounds) print(presentedFrame) let marginX = presentedFrame.origin.x let marginY = presentedFrame.origin.y if let touch = touches.first as UITouch?{ let loc = touch.location(in: myImageView) let image = myImageView.image let tapX = (image?.size.width)! / presentedFrame.size.width * (loc.x - marginX) let tapY = (image?.size.height)! / presentedFrame.size.height * (loc.y - marginY) let color = image?.getColor(pos: CGPoint(x: tapX, y: tapY)) print(color!) } } } extension UIImage { func getColor(pos: CGPoint) -> (color: UIColor, r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat) { let imageData = self.cgImage?.dataProvider?.data let data:UnsafePointer = CFDataGetBytePtr(imageData) let scale:CGFloat = 1.0 let address:Int = ((Int(self.size.width) * Int(pos.y * scale)) + Int(pos.x * scale)) * pixelDataBytesSize let r = CGFloat(data[address]) let g = CGFloat(data[address + 1]) let b = CGFloat(data[address + 2]) let a = CGFloat(data[address + 3]) return (UIColor(red: r / 255, green: g / 255, blue: b / 255, alpha: a / 255), r,g,b,a) } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

全座標のカラーを、rgb(255, 255, 255)で表すのではなく、red, white, blackと変換し、一番多いカラーをその画像のカラーとして認識させるのはどうでしょうか?

変換前->

x1x2x3
rgb(0, 25, 34)rgb(240, 25, 34)rgb(220, 45, 34)
rgb(233, 255, 234)rgb(0, 25, 34)rgb(0, 25, 34)

変換後->

x1x2x3
blackredorange
whiteblackblack

blackが一番多いので、blackが主体の画像

投稿2021/12/03 09:20

zundaa

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問