CIImage экстент в пикселях или точках?

Я работаю с CIImage, и хотя я понимаю, что это не линейное изображение, оно содержит некоторые данные.

Мой вопрос заключается в том, возвращает ли свойство экстента CIImage пикселей или точек? Согласно документации, в которой очень мало сказано, это координаты рабочего пространства. Означает ли это, что нет способа получить пиксели / точки из CIImage, и я должен преобразовать в UIImage, чтобы использовать свойство.size для получения точек?

У меня есть UIImage с определенным размером, и когда я создаю CIImage с использованием UIImage, экстент отображается в пунктах. Но если я запускаю CIImage через CIFilter, который масштабирует его, я иногда получаю экстент, возвращаемый в значениях пикселей.

2 ответа

Решение

Я отвечу как можно лучше.

Если ваш источник UIImage, его size будет таким же, как степень. Но, пожалуйста, это не UIImageView (размер которого указан в пунктах). И мы просто говорим об исходном изображении.

Запуск чего-либо через CIFilter означает, что вы манипулируете вещами. Если все, что вы делаете - это манипулируете цветом, его размер / размер не должны меняться (так же, как и создание собственного CIColorKernel - работает попиксельно).

Но, в зависимости от CIFilter, вы можете изменять размер / экстент. Определенные фильтры создают маску или плитку. Они могут иметь бесконечную степень! Другие (хороший пример размытия) выбирают окружающие пиксели, поэтому их размер увеличивается, потому что они выбирают "пиксели" за пределы размера исходного изображения. (По индивидуальному заказу это CIWarpKernel.)

Да, совсем немного. Принимая это к нижней строке:

  • Что делает фильтр? Нужно ли просто проверять RGB пикселя и что-то делать? Тогда размер UIImage должен быть выходным экстентом CIImage.
  • Производит ли фильтр что-то, что зависит от окружающих пикселей пикселя? Тогда выходной экстент CIImage будет немного больше. Сколько может зависеть от фильтра.
  • Существуют фильтры, которые производят что-то без учета ввода. Большинство из них могут не иметь истинной степени, поскольку они могут быть бесконечными.

Точки - это то, с чем всегда работают UIKit и CoreGraphics. Пиксели? В какой-то момент CoreImage делает это, но это низкоуровневый уровень (если вы не хотите писать свое собственное ядро), вас это не должно волновать. Экстенты обычно - но имейте ввиду, что выше - приравниваются к размеру UIImage.

РЕДАКТИРОВАТЬ

Многие изображения (особенно RAW) могут иметь такой большой размер, что это может повлиять на производительность. У меня есть расширение для UIImage, которое изменяет размеры изображения до определенного прямоугольника, чтобы помочь поддерживать постоянную производительность CI.

extension UIImage {
    public func resizeToBoundingSquare(_ boundingSquareSideLength : CGFloat) -> UIImage {
        let imgScale = self.size.width > self.size.height ? boundingSquareSideLength / self.size.width : boundingSquareSideLength / self.size.height
        let newWidth = self.size.width * imgScale
        let newHeight = self.size.height * imgScale
        let newSize = CGSize(width: newWidth, height: newHeight)
        UIGraphicsBeginImageContext(newSize)
        self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
        let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext();
        return resizedImage!
    }
}

Использование:

image = image.resizeToBoundingSquare(640)

В этом примере размер изображения 3200x2000 будет уменьшен до 640x400. Или размер изображения или 320x200 будет увеличен до 640x400. Я делаю это с изображением перед его рендерингом и перед созданием CIImage для использования в CIFilter.

Я предлагаю вам думать о них как о точках. Там нет масштаба и нет экрана (CIImage не то, что рисуется), поэтому нет пикселей.

UIImage, поддерживаемый CGImage, является основой для рисования, и в дополнение к CGImage имеет масштаб; вместе с разрешением экрана, которое дает нам перевод из точек в пиксели.

Другие вопросы по тегам