Размер изображения изменился после загрузки в хранилище Firebase - PullRequest
0 голосов
/ 16 сентября 2018

imageToUpload здесь 375x500. После загрузки в Firebase Storage ширина и высота были удвоены. Есть ли способ сохранить размер без изменений после загрузки в Firebase Storage?

if let uploadData = UIImageJPEGRepresentation(imageToUpload, 0.0) {
            uploadImageRef.putData(uploadData, metadata: nil) { (metadata, error) in
                if error != nil {
                    print("error")
                    completion?(false)
                } else {
                    // your uploaded photo url.
                    // Metadata contains file metadata such as size, content-type.
                    let size = metadata?.size
                    // You can also access to download URL after upload.
                    uploadImageRef.downloadURL { (url, error) in
                        guard let downloadURL = url else {
                            // Uh-oh, an error occurred!
                            completion?(false)
                            return
                        }
                        print("Download url : \(downloadURL)")
                        completion?(true)
                    }
                }
            }
        }

Обратите внимание, что я использую расширение ниже, чтобы изменить размер изображения до 375x500 (размер imageToUpload) перед загрузкой.

extension UIImage {
    func resized(to size: CGSize) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: CGRect(origin: .zero, size: size))
        }
    }
}

let imageToUploadResize:UIImage = image.resized(to: CGSize(width: 375.0, height: 500.0))

Ответы [ 2 ]

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

Как я уже упоминал в своем комментарии, IMO, функция в расширении действительно вызывается как отдельная функция, а не расширяет ее функциональность. Я бы предложил сделать его функцией изменения размера переданного изображения и возврата нового изображения.

Используя эту функцию, ваше изображение будет изменено до правильного размера и загружено в этот размер (проверено, что оно работает)

func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
    let rect = CGRect(x: 0, y: 0, width: targetSize.width, height: targetSize.height)
    UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

и затем называется так

let updatedSize = CGSize(width: 300.0, height: 400.0)
let resizedImage = self.resizeImage(image: origImage!, targetSize: updatedSize)

Теперь для решения проблемы с расширением на уровне 10 тыс. Футов.

Все это восходит к точкам по сравнению с тем, как оно отображается на iDevice. Возвращаясь к iPhone 2g, 3g, это был 1-1 для рендеринга, так что если вы запустите свой код на этом устройстве в симуляторе и установите размер изображения 320x480, это будет изображение 320x480, сохраненное в базе данных Firebase. Однако с улучшением экранов и повышением разрешающей способности изменился и рендеринг, который влияет на UIImage.

Таким образом, если бы вы настроили симуляцию проекта на iPhone 6, это же изображение было бы 640x960 (2x), а затем на iPhone 8+, размер был бы 960 x 1440 (3x). (здесь задействовано повышение дискретизации, поэтому мы игнорируем это здесь).

UIImage знает, на каком устройстве оно находится, так что это следует учитывать.

Опять же, это, вообще говоря, и задействовано много других компонентов, в частности, пиксели = logicPoints * scaleFactor

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

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

Если вы хотите продолжать использовать ваше расширение, я бы посоветовал попробовать

extension UIImage {
    func resized(to size: CGSize) {
        self = UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: CGRect(origin: .zero, size: size))
        }
    }
}
...