UIImagePickerController () действительно показывает изображение хорошо в представлении UIImage, но вращается в представлении коллекции и таблицы UIImage? - PullRequest
0 голосов
/ 09 сентября 2018

Я в тупике и надеюсь, что кто-нибудь может дать мне немного крошек для исследования. Я искал, но не смог найти тот же вопрос, поэтому прошу прощения, если он был задан и получен ответ.

У меня есть простое приложение, где пользователь может загружать фотографии в сообщение на Parse-Server, используя:

@IBAction func SelectImage(_ sender: Any) {
    let imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
    imagePicker.allowsEditing = false
    self.present(imagePicker, animated: true, completion: nil)
}

Если это первое изображение, я устанавливаю UIImageView для выбранного изображения и добавляю его в массив PFFiles. Если это не первый, я просто добавляю его в массив. Затем я установил представление коллекции, чтобы показать все изображения в массиве PFFile.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        if !image1Set {
            blipImage.image = image
            imagePicked = true
            image1Set = true
        } else if !image2Set {
            image2Set = true
        } else if !image3Set {
            image3Set = true
        }
        // Build an array of the files for the blip
        if let imageData = UIImagePNGRepresentation(image) {
            if let blipFile = PFFile(name: "image.png", data: imageData) {
                newBlipFiles.append(blipFile)
                blipFiles.append(blipFile)
            }
        }
        blipFileCollectionView.reloadData()
    }
    dismiss(animated: true, completion: nil)
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell:BlipMainCell = collectionView.dequeueReusableCell(withReuseIdentifier: "fileCell", for: indexPath) as! BlipMainCell

    blipFiles[indexPath.row].getDataInBackground { (data, error) in
        if let imageData = data {
            if let imageToDisplay = UIImage(data: imageData) {
                cell.image.image = imageToDisplay
            }
        }
    }
    return cell
}

Когда я запускаю это на симуляторе, все выглядит нормально. Когда я проверяю это на телефоне, хотя фотография в виде коллекции переворачивает ее на бок. Как только фотография считывается на сервер и ранее загруженное изображение добавляется в тот же контроллер представления, изображение переворачивается на представление коллекции И в UIImageView, который первоначально показывал его правильно. Когда изображение извлекается с сервера и используется в качестве значка в табличном представлении, оно также переворачивается.

Моя гипотеза состоит в том, что что-то происходит, когда изображение преобразуется в данные с использованием UIImagePNGRepresentation (изображение), так что ориентация удаляется. Это объясняет, почему все время его чтение в виде PFFile переворачивается, но не при первоначальной настройке, но когда он запускает тот же UIImageView, который был в порядке, он переворачивается.

Может кто-нибудь помочь мне понять это? В глубине души я надеюсь, что это так же просто, как добавить некий аргумент в кодировку данных PFFile, чтобы UIImagePNGRepresentation (изображение) сохранял правильную ориентацию. Хотя это очень расстраивает, потому что я не могу иметь приложение, в котором ориентация не учитывает то, что ожидает пользователь, потому что это то, что они видят в своей камере.

Спасибо, Дэн

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Проблема в том, что у вас были правильные данные, но вы выбросили их при извлечении UIImagePickerControllerOriginalImage. Это неправильный ключ, если вы собираетесь загрузить данные изображения. Вы хотели UIImagePickerControllerImageURL. Это данные на диске. Загрузите это, не шутя сначала!

0 голосов
/ 09 сентября 2018

Это потому, что когда вы преобразуете свой объект UIImage в представление данных PNG, он отбрасывает метаданные exif изображения, включая информацию об ориентации изображения. Решение состоит в том, чтобы использовать представление данных JPEG, которое сохраняет ориентацию изображения, а также имеет преимущество уменьшения размера данных изображения. Если вам действительно нужно загрузить PNG, вы можете перерисовать свое изображение в новом контексте изображения, а затем преобразовать новое изображение в данные.

...