CGImage.masking (_ :) не применяет маску - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь использовать CGImage, который я создал из необработанных данных, в качестве маски изображения для другого изображения.Согласно документации CGImage.masking (_ :) изображение, которое будет использоваться в качестве маски изображения, должно находиться в цветовом пространстве GreyScale и не иметь альфа-компонента.Оба требования выполнены.Верхняя половина изображения, используемая в качестве маски изображения, содержит черные пиксели, нижняя половина - белые пиксели.Таким образом, применение этого к изображению, состоящему из красных пикселей, должно обязательно заставить половину красного изображения исчезнуть (код ниже, может быть непосредственно вставлен на игровую площадку).Но, как вы можете видеть, это не так!

Любая помощь очень ценится, поскольку я уже пробовал так много разных методов, таких как использование другого инициализатора маски изображения (в отличие от использования изображения).Сначала я пробовал использовать маску в формате ARGB, но это тоже не сработало.Спасибо!

import UIKit

struct ARGBPixel {
    var alpha: UInt8
    var red: UInt8
    var green: UInt8
    var blue: UInt8
}

struct GreyScalePixel {
    var value: UInt8
}

let greyScaleCS = CGColorSpaceCreateDeviceGray()
greyScaleCS.baseColorSpace
greyScaleCS.numberOfComponents

//create solid red image
let width = 100
let height = 100
let size = width * height

let solidRedPixel = ARGBPixel(alpha: 255, red: 255, green: 0, blue: 0)
let solidRedPixels = [ARGBPixel](repeating: solidRedPixel, count: size)
let solidRedPixelsPtr: UnsafePointer<UInt8> = UnsafeRawPointer(solidRedPixels).assumingMemoryBound(to: UInt8.self)
let data: CFData = CFDataCreate(nil, solidRedPixelsPtr, size *  MemoryLayout<ARGBPixel>.stride)!
let dataProvider: CGDataProvider = CGDataProvider(data: data)!
let solidRed = CGImage(width: width,
                           height: width,
                           bitsPerComponent: 8,
                           bitsPerPixel: 32,
                           bytesPerRow: width * 4,
                           space: CGColorSpaceCreateDeviceRGB(),
                           bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue),
                           provider: dataProvider,
                           decode: nil,
                           shouldInterpolate: true,
                           intent: CGColorRenderingIntent.defaultIntent)!
let imgRed = UIImage(cgImage: solidRed)


//create mask consisiting of 5000 black and 5000 white greyscal pixels
let blackPixel = GreyScalePixel(value: 0)
let whitePixel = GreyScalePixel(value: 255)
let blackPixels = [GreyScalePixel](repeating: blackPixel, count: size/2)
let whitePixels = [GreyScalePixel](repeating: whitePixel, count: size/2)
let maskPixels = blackPixels + whitePixels
let maskPixelPtr: UnsafePointer<UInt8> = UnsafeRawPointer(maskPixels).assumingMemoryBound(to: UInt8.self)
let maskData: CFData = CFDataCreate(nil, maskPixelPtr, size *  MemoryLayout<GreyScalePixel>.stride)!
let maskDataProvider: CGDataProvider = CGDataProvider(data: maskData)!
let maskImage = CGImage(width: width,
                   height: height,
                   bitsPerComponent: 8,
                   bitsPerPixel: 8,
                   bytesPerRow: width,
                   space: CGColorSpaceCreateDeviceGray(),
                   bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue),
                   provider: maskDataProvider,
                   decode: nil,
                   shouldInterpolate: true,
                   intent:  CGColorRenderingIntent.defaultIntent)!

let maskAsImg = UIImage(cgImage: maskImage)

//apply mask
let maskedImage = solidRed.masking(maskImage)!
let result = UIImage(cgImage: maskedImage)
// result is still all red, how can I make one half transparent???```
...