Получить UIColor из изображения - PullRequest
0 голосов
/ 05 декабря 2018

Когда я посмотрел дальше на данные, возвращенные с CGImage dataProvider, я заметил числа, повторяющиеся в наборах по 8:

127, 134, 255, 251, 95, 211, 255, 255 
127, 134, 255, 251, 95, 211, 255, 255 
127, 134, 255, 251, 95, 211, 255, 255 

В предыдущих решениях, которые я обнаружил, не используются наборы по 8они используют строгие наборы из 4, как в коде, который я скопировал из ответа, найденного в ImageProcessor.Я знаю, что существуют разные каналы и глубины и другая терминология для работы с цветами.Три строки выше, я предполагаю, представляют три пикселя подряд.Затем есть 4 канала RGBA, но они разделены на набор чисел: 2 для красного, 2 для зеленого и т. Д. Я вижу, что альфа-канал полностью установлен на 255 255, что имеет смысл, учитывая контекст снимок экрана используется.

Мой вопрос:

Как объединить эти "каналы", если это правильный термин, в 4 используемых числа для RGBA?Как я могу слить 127 134 в красный, 255 251 в зеленый и т. Д.?Нужно ли мне использовать какое-то смещение байтов (что я не знаю, как это сделать), чтобы объединить числа только в 4 значения?

Код для контекста:

(От ответа не требуется)

Я пытаюсь извлечь цвет для отдельного пикселя в изображении на iOS с помощью Swift 4. Я хочу получить пиксель, а затем выполнить операции на основе пикселяданные для графического редактора, над которым я работаю.Это скриншот, с которого я хочу получить пиксель с координатой.

Я искал несколько мест для ответа на мой вопрос, но по какой-то причине все найденные ответы не дают UIColorкоторые соответствуют цвету с картинки.

Попытки решения : 1 2 3 ... и еще десятки

The current image

Текущее изображение, которое я использую (снято с приложением pixel ).Все изображение, за исключением нескольких черных текстовых областей, должно содержать данные о пикселях, соответствующие показанному шестнадцатеричному цвету: # 4DFFD0 .

Я набрал следующий код из различных "ответов" по всейИнтернет, и все дают неправильные цвета.

Чтобы получить цвет в пикселе ( Внутри класса ImageProcessor):

var image: UIImage

func color(at pos: CGPoint) -> UIColor {
    let pixelData = image.cgImage!.dataProvider!.data!
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

    let pixelInfo: Int = ((Int(image.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)
}

Загрузить изображение и получить цвет ( Внутри ViewController.swift):

let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaSubtype = %d", PHAssetMediaSubtype.photoScreenshot.rawValue)
let scFetch = PHAsset.fetchAssets(with: .image, options: fetchOptions)
if (scFetch.count > 0) {
    let lastSC = getUIImage(asset: scFetch.lastObject!)

    let processor = ImageProcessor(currentImage: lastSC!)
    let cornerColor = processor.color(at: 0, y: 0)
    // ...
}

Всякий раз, когда я смотрю на значение cornerColor, цвет в верхнем левом углу изображения ,он возвращает числа 127 134 255 251, которые cornerColor использует в качестве значений RGBA.

...