UIImagePNGRepresentation(UIImage()) возвращает ноль

Почему UIImagePNGRepresentation(UIImage()) возвращает nil?

Я пытаюсь создать UIImage() в своем тестовом коде, чтобы подтвердить, что он был правильно передан.

Мой метод сравнения двух UIImage использует UIImagePNGRepresentation(), но по какой-то причине возвращает nil.

Спасибо.


person Rodrigo Ruiz    schedule 04.03.2015    source источник
comment
Вы действительно пытаетесь использовать UIImagePNGRepresentation(UIImage()) или UIImage() просто заполнитель для уже созданного UIImage?   -  person Jojodmo    schedule 04.03.2015
comment
У меня есть структура, которая передается, и эта структура содержит UIImage. Я устанавливаю его свойство на = UIImage(). Затем позже я сравниваю это свойство с другим UIImage. Это сравнение выполняется через UIImagePNGRepresentation(image1) == UIImagePNGRepresentation(image2)   -  person Rodrigo Ruiz    schedule 04.03.2015


Ответы (3)


UIImagePNGRepresentation() вернет nil, если предоставленный UIImage не содержит никаких данных. Из документации UIKit< /а>:

Возвращаемое значение

Объект данных, содержащий данные PNG, или nil, если возникла проблема с созданием данных. Эта функция может возвращать nil, если изображение не содержит данных или базовая CGImageRef содержит данные в неподдерживаемом формате растрового изображения.

Когда вы инициализируете UIImage, просто используя UIImage(), он создает UIImage без данных. Хотя изображение не равно нулю, оно все еще не содержит данных. А поскольку в изображении нет данных, UIImagePNGRepresentation() просто возвращает nil.

Чтобы исправить это, вам придется использовать UIImage с данными. Например:

var imageName: String = "MyImageName.png"
var image = UIImage(named: imageName)
var rep = UIImagePNGRepresentation(image)

Где imageName — это имя вашего изображения, включенного в ваше приложение.

Чтобы использовать UIImagePNGRepresentation(image), image не должно быть nil, а также должно иметь данные.

Если вы хотите проверить, есть ли у них какие-либо данные, вы можете использовать:

if(image == nil || image == UIImage()){
  //image is nil, or has no data
}
else{
  //image has data
}
person Jojodmo    schedule 04.03.2015
comment
Как проверить, есть ли на изображении какие-либо данные или нет? Поскольку UIImagePNGRepresentation просто приведет к сбою приложения, если будет передано UIImage()... - person Rodrigo Ruiz; 04.03.2015
comment
Это не работает, когда я пытаюсь сравнить возвращаемое значение UIImagePNGRepresentation, приложение вылетает. - person Rodrigo Ruiz; 04.03.2015
comment
Если вы используете именно этот код, он не будет работать, потому что в ваше приложение не включено изображение с именем MyImageName.png. Это просто пример того, что вы могли бы сделать. TL;DR; вам нужно каким-то образом создать UIImage с некоторым объемом данных, чтобы UIImagePNGRepresentation(image) не возвращал nil. Вы не можете использовать UIImage() в качестве изображения, так как у него нет данных. - person Jojodmo; 04.03.2015
comment
Но как мне проверить в моем методе Comparison, есть ли у изображения, переданного в UIImagePNGRepresentation, какие-либо данные? поэтому я могу избежать выполнения UIImagePNGRepresentation(image1) == UIImagePNGRepresentation(image2) (что приведет к сбою), если у изображения1 или изображения2 нет данных. - person Rodrigo Ruiz; 04.03.2015
comment
Я только что обновил свой ответ, если вы хотите проверить, есть ли у них какие-либо данные, вы можете просто проверить, есть ли image == UIImage(), что по существу проверяет, равно ли изображение изображению без данных. - person Jojodmo; 04.03.2015
comment
Как принять 2 ответа? Ваш ответ решил одну проблему для меня, но ответ другого парня также решил другую проблему. - person Rodrigo Ruiz; 04.03.2015
comment
@RodrigoRuiz Я бы проголосовал за них, а затем принял бы то, что, по вашему мнению, больше всего поможет другим в будущем. - person Jojodmo; 04.03.2015
comment
Ваш был самым полезным с точки зрения понимания (а также помог мне исправить ошибку в моем методе Comparison. Я должен был добавить тесты для этого...), его был самым полезным в реальных тестах. Не могли бы вы отредактировать свой ответ, сказав что-то вроде «Для метода тестирования посмотрите на этот другой ответ»? - person Rodrigo Ruiz; 04.03.2015
comment
Давайте продолжим обсуждение в чате. - person Jojodmo; 04.03.2015

В UIImage документации говорится

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

Поскольку вы создали UIImage без предоставления каких-либо данных изображения, созданный вами объект не имеет значения как изображение. UIKit и Core Graphics не позволяют использовать изображения 0x0.

Самое простое исправление — вместо этого создать изображение 1x1:

UIGraphicsBeginImageContext(CGSizeMake(1, 1))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
person rob mayoff    schedule 04.03.2015

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

       func getImagePngData(img : UIImage) -> Data {

            let pngData = Data()

            if let hasData = img.pngData(){
                print(hasData)
                pngData = hasData
             }
            else{
                    UIGraphicsBeginImageContext(img.size)
                    img.draw(in: CGRect(x: 0.0, y: 0.0, width: img.width, 
                    height: img.height))
                    let resultImage =
                                   UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()
                    print(resultImage.pngData)
                    pngData = resultImage.pngData
            }
         return pngData
        }
person Naqeeb Ahmed    schedule 21.07.2020
comment
Как вы вообще запускаете этот код? pngData - это let, UIImage не имеет высоты или ширины... - person Alex Shvets; 07.11.2020