Я извлекаю пиксельные цвета из CGImage
, используя код, описанный в этого ответа .
Однако я только что понял, что если я загружаю изображение, созданное на другом устройство, значения пикселей выглядят неправильно. Первая очевидная проблема заключается в том, что альфа исчезла. CGImageAlphaInfo
сообщает .noneSkipLast
, но я знаю, что изображение RGBA. Если я читаю его с того же устройства, на котором он был создан, это выглядит нормально. Вторая проблема состоит в том, что есть некоторое цветное кровотечение, как будто изображение было изменено. Возможно, это сжатие или что-то.
Вот пример:
Исходное изображение - это арбуз, 12x12
![Source image](https://i.stack.imgur.com/xiSVX.png)
Он был создан на моем iPad. Но если я загружаю его на свой iPhone через iCloud, используя тот код, который я связал, я получаю это:
![Bad sampling](https://i.stack.imgur.com/uOPNL.jpg)
Альфа-канал пропал, и * Цвета кровоточат.
Если из того же iPhone я отправляю маленький арбуз своему Ма c, используя Airdrop, и снова отправляю его обратно, используя Airdrop (так что это, предположительно, то же изображение!), и загружаю теперь я получаю правильное изображение:
(темно-коричневые области - это где альфа равен 0)
Если у вас есть пара устройств iOS с включенным iCloud вы можете воспроизвести это поведение в этом приложении: http://swiftpixels.endavid.com, где я использую этот код для чтения цветов пикселей.
В чем может быть разница между этими изображениями? Как я могу прочитать правильное изображение из iCloud? Стоит ли искать подсказки в UIImage
вместо CGImage
?
Есть какие-нибудь подсказки? Спасибо!
Обновление
Для справки, я читаю изображение, используя UIImagePickerController
, используя этот код:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
loadImageInMemory(image)
}
picker.dismiss(animated: true, completion: nil)
self.presentingViewController?.dismiss(animated: true, completion: nil)
}
fileprivate func loadImageInMemory(_ image: UIImage) {
/// skipping some preparation
guard let cgImage = image.cgImage else {
return
}
/// getImageData is a function like getPixelColor linked above,
/// but for a Rect
self.imageData = cgImage.getImageData(rect, width, height)
}
I также нашел этот вопрос, который может быть связан: UIImagePickerController и фотографии iCloud
Как Роб предложил в комментариях ниже, я изменил настройки Фото в своем телефоне на «Загрузить и сохранить оригиналы» (вместо этого «Оптимизировать iPhone Хранилище»), и это решает проблему. Поэтому я предполагаю, что вопрос заключается в том, почему iCloud пытается сжать изображение PNG размером всего 1355 байт, и можно ли получить доступ к исходному изображению из UIImagePickerController