Почему мой CGImage в 3 раза больше размера UIImage

У меня есть функция, которая принимает UIImage и цвет и использует его для возврата UIImage именно этого цвета.

Как часть функции UIImage преобразуется в CGImage, но по какой-то причине CGImage в 3 раза больше размера UIImage, что означает, что конечный результат в 3 раза больше, чем должен быть.

Вот функция

func coloredImageNamed(name: String, color: UIColor) -> UIImage {

    let startImage: UIImage = UIImage(named: name)!
    print("UIImage W: \(startImage.size.width) H\(startImage.size.height)")

    let maskImage: CGImage = startImage.CGImage!
    print("CGImage W: \(CGImageGetWidth(maskImage)) H\(CGImageGetHeight(maskImage))")

    // Make the image that the mask is applied to (Just a rectangle of the color want to use)
    let colorImageSize: CGSize = CGSizeMake(startImage.size.width, startImage.size.height)
    let colorFillImage: CGImage = getImageWithColor(color, size: colorImageSize).CGImage!

    // Make the mask image into a mask
    let mask: CGImage = CGImageMaskCreate(CGImageGetWidth(maskImage),
        CGImageGetHeight(maskImage),
        CGImageGetBitsPerComponent(maskImage),
        CGImageGetBitsPerPixel(maskImage),
        CGImageGetBytesPerRow(maskImage),
        CGImageGetDataProvider(maskImage), nil, false)!

        // Create the new image and convert back to UIImage, then return
        let masked: CGImage! = CGImageCreateWithMask(colorFillImage, mask);
        let returnImage: UIImage! = UIImage(CGImage: masked)
     return returnImage
}

Вы можете видеть в первых нескольких строках, что я использовал print() для вывода размера каждого UIImage и CGImage на консоль. CGImage всегда в 3 раза больше размера UIImage... Я подозреваю, что это как-то связано с @2x, @3x и т. д.?

Итак, вопрос в том, почему это происходит и что можно сделать, чтобы получить изображение того же размера, что и то, с которого я начал?


person 365SplendidSuns    schedule 11.03.2016    source источник


Ответы (1)


Это потому, что UIImage имеет свойство scale. Это промежуточное звено между пикселями и точками. Так, например, UIImage, созданный из изображения размером 180 x 180 пикселей, но с scale равным 3, автоматически обрабатывается как имеющий размер 60 x 60 точек. Он сообщит о своем размере как 60x60, а также будет хорошо смотреться на экране с 3-кратным разрешением, где 3 пикселя соответствуют 1 точке. И, как вы правильно догадались, суффикс @3x или соответствующее место в каталоге активов сообщает системе, что UIImage должен присваивать UIImage scale из 3 по мере его формирования.

Но CGImage не имеет такого свойства; это просто растровое изображение, фактические пиксели изображения. Таким образом, CGImage, сформированный из UIImage, созданного из изображения размером 180 x 180 пикселей, также имеет размер 180 x 180 точек.

person matt    schedule 11.03.2016
comment
Подробнее об этой теме см. в моей книге: apeth.com/iOSBook/ch15.html #_cgimage_drawing В этом разделе говорится именно о том, что делать, когда вы рисуете CGImage, чтобы не получить неправильный размер. - person matt; 11.03.2016