Ale*_*ski 3 macos cocoa colors objective-c nsimage
有没有办法可以更改 NSimage 或 NSBitmapImageRep/CGimage 等的颜色空间。我对任何方式都持开放态度。最好是Photoshop的方式。
小智 5
您在下面看到的代码的问题
CGImageRef CGImageCreateCopyWithColorSpace (
CGImageRef image,
CGColorSpaceRef colorspace
);
Run Code Online (Sandbox Code Playgroud)
不工作,因为 Quartz2D 不支持 CMYK 图像或灰度图像的 alpha,它仅受 RGB 图像支持。您应该做的是创建 2 个图像,然后在 CMYK 颜色空间和带有 alpha 的图像的情况下进行组合。我已经搜索了很多关于这个主题,终于找到了。可能是这个问题的作者不再需要它,但其他人可能需要它。
创建新的 NSBitmapImageRep
let imageRep = NSBitmapImageRep(bitmapDataPlanes: nil,
pixelsWide: Int(round(imageSize.width)),
pixelsHigh: Int(round(imageSize.height)),
bitsPerSample: 8,
samplesPerPixel: 4,
hasAlpha: false,
isPlanar: false,
colorSpaceName: NSDeviceCMYKColorSpace,
bitmapFormat: NSBitmapFormat(rawValue: 0),
bytesPerRow: Int(round(imageSize.width) * CGFloat(4)),
bitsPerPixel: 0)
Run Code Online (Sandbox Code Playgroud)您需要将图像绘制到新的位图中,假设您有 colorSpace: NSColorSpace
let context = NSGraphicsContext(bitmapImageRep: imageRep)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext(context)
imageRep.setProperty(NSImageColorSyncProfileData, withValue: colorSpace.ICCProfileData)
// Do your drawing here
NSGraphicsContext.restoreGraphicsState()
Run Code Online (Sandbox Code Playgroud)在此之后,您将拥有一个 imageRep,它是具有正确色彩空间但没有 alpha(透明度)的图像。
您需要一个遮罩位图。获得面具是一件棘手的事情。
let imageRep = NSBitmapImageRep(bitmapDataPlanes: nil,
pixelsWide: Int(round(imageSize.width)),
pixelsHigh: Int(round(imageSize.height)),
bitsPerSample: 8,
samplesPerPixel: 1,
hasAlpha: false,
isPlanar: false,
colorSpaceName: NSDeviceWhiteColorSpace,
bitmapFormat: NSBitmapFormat(rawValue: 0),
bytesPerRow: Int(round(imageSize.width)),
bitsPerPixel: 0)
Run Code Online (Sandbox Code Playgroud)将白色图像剪辑到具有透明度的图像
if let graphicsPort = NSGraphicsContext.currentContext()?.graphicsPort {
let context = unsafeBitCast(graphicsPort, CGContextRef.self)
let imgRect = NSRect(origin: NSPoint.zero, size: image.extent.size)
let ciContext = CIContext()
let cgImage = ciContext.createCGImage(image, fromRect: image.extent)
CGContextClipToMask(context, imgRect, cgImage)
}
Run Code Online (Sandbox Code Playgroud)将所有像素着色为白色,这将被剪辑到图像中。
let context = NSGraphicsContext(bitmapImageRep: imageRep)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.setCurrentContext(context)
imageRep.setProperty(NSImageColorSyncProfileData, withValue: colorSpace.ICCProfileData)
NSColor.whiteColor().setFill()
NSBezierPath.fillRect(NSRect(origin: NSPoint.zero, size: imageSize))
NSGraphicsContext.restoreGraphicsState()
Run Code Online (Sandbox Code Playgroud)在这一步你有一个图像和一个蒙版。接下来我们需要将它们组合起来。我正在使用这个小算法(您需要验证蒙版和源图像具有相同的大小和相同的颜色空间模型):
func createCMYKAImageRepByApplingAlphaMask(srcImageRep: NSBitmapImageRep, alphaMaskImageRep alphaMask: NSBitmapImageRep) -> NSBitmapImageRep? {
if canApplyMaskRepOnImageRep(srcImageRep, maskRep: alphaMask) == false {
return nil
}
let alphaData = alphaMask.bitmapData
let srcData = srcImageRep.bitmapData
if let imageWithAlphaMaskRep = createEmptyCMYKABitmapImageRep(alphaMask.size) {
if let colorSpaceData = imageColorSpace?.ICCProfileData {
imageWithAlphaMaskRep.setProperty(NSImageColorSyncProfileData, withValue: colorSpaceData)
}
fillPixelsWithComponentsData(imageWithAlphaMaskRep, components: { (pixelIdx: Int) -> (UInt8, UInt8, UInt8, UInt8, UInt8) in
let cyan = srcData[pixelIdx * 4 + 0]
let magenta = srcData[pixelIdx * 4 + 1]
let yellow = srcData[pixelIdx * 4 + 2]
let black = srcData[pixelIdx * 4 + 3]
let alpha = alphaData[pixelIdx]
return (cyan, magenta, yellow, black, alpha)
})
return imageWithAlphaMaskRep
}
return nil
}
func createEmptyBitmapImageRep() -> NSBitmapImageRep? {
let imageRep = NSBitmapImageRep(bitmapDataPlanes: nil,
pixelsWide: Int(round(imageSize.width)),
pixelsHigh: Int(round(imageSize.height)),
bitsPerSample: 8,
samplesPerPixel: 5,
hasAlpha: true,
isPlanar: false,
colorSpaceName: NSDeviceCMYKColorSpace,
bitmapFormat: NSBitmapFormat(rawValue: 0),
bytesPerRow: Int(round(imageSize.width) * CGFloat(5)),
bitsPerPixel: 0)
return imageRep
}
private func fillPixelsWithComponentsData(imgRep: NSBitmapImageRep,
components: (Int) -> (cyan:UInt8, magenta:UInt8, yellow:UInt8, black:UInt8, alpha:UInt8)) {
let imageRawData = imgRep.bitmapData
let imageWidth = Int(imgRep.size.width)
let imageHeight = Int(imgRep.size.height)
for pixelIdx in 0 ..< (imageWidth * imageHeight) {
let (cyan, magenta, yellow, black, alpha) = components(pixelIdx)
let fAlpha = Float(alpha) / 255
imageRawData[pixelIdx * 5 + 0] = UInt8(Float(cyan) * fAlpha)
imageRawData[pixelIdx * 5 + 1] = UInt8(Float(magenta) * fAlpha)
imageRawData[pixelIdx * 5 + 2] = UInt8(Float(yellow) * fAlpha)
imageRawData[pixelIdx * 5 + 3] = UInt8(Float(black) * fAlpha)
imageRawData[pixelIdx * 5 + 4] = alpha
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4110 次 |
| 最近记录: |