我有一张大图和一张小图,都是Data字的,我都转换成了NSImage字.我想把较小的图像放在大图像的顶部,左上角对齐,在新的单NSImage中.

目前,此代码可以工作,但是lockFocusunlockFocus都已弃用.我认为文档不够清楚,我无法理解我应该如何重写它.

以下是工作代码:

func combineImages(image1: NSImage, image2: NSImage) -> NSImage {
    let size = NSMakeSize(max(image1.size.width, image2.size.width), max(image1.size.height, image2.size.height))
    let newImage = NSImage(size: size)
    
    newImage.lockFocus()
    
    image2.draw(at: NSPoint(x: 0, y: size.height - image2.size.height), from: NSZeroRect, operation: .sourceOver, fraction: 1.0)
    image1.draw(at: NSZeroPoint, from: NSZeroRect, operation: .sourceOver, fraction: 1.0)
    
    newImage.unlockFocus()

    return newImage
}

不推荐使用的方法是:

此方法与分辨率无关的绘图不兼容,并且 不应使用.

推荐答案

您可以改用init(size:flipped:drawingHandler:):

func combineImages(image1: NSImage, image2: NSImage) -> NSImage {
    let size = NSSize(width: max(image1.size.width, image2.size.width), height: max(image1.size.height, image2.size.height))
    let newImage = NSImage(size: size, flipped: false) { _ in
        let drawPointImage2 = NSPoint(x: 0, y: size.height - image2.size.height)
        image2.draw(at: drawPointImage2, from: NSRect(origin: .zero, size: image2.size), operation: .sourceOver, fraction: 1.0)
        image1.draw(at: NSPoint.zero, from: NSRect(origin: .zero, size: image1.size), operation: .sourceOver, fraction: 1.0)
        return true
    }
    
    return newImage
}

使用rect闭合:

func combineImages(image1: NSImage, image2: NSImage) -> NSImage {
    let size = NSSize(width: max(image1.size.width, image2.size.width), height: max(image1.size.height, image2.size.height))
    let newImage = NSImage(size: size, flipped: false) { rect -> Bool in
        let drawPointImage2 = NSPoint(x: 0, y: size.height - image2.size.height)
        image2.draw(at: drawPointImage2, from: NSRect(origin: .zero, size: image2.size), operation: .sourceOver, fraction: 1.0)
        image1.draw(at: NSPoint.zero, from: NSRect(origin: .zero, size: image1.size), operation: .sourceOver, fraction: 1.0)
        return true
    }
    
    return newImage
}

GB init(size:flipped:drawingHandler:)

Swift相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

绑定到可选值的非可选属性?'

带DispatchSourceTimer的定时器

如何在枚举有关联数据时使用combined if with case

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

为什么我不能在这个 Swift 间接枚举中返回 self ?

OSX 中的 Popover 无法确定透明度

在SwiftUI中使用ForEach循环来显示字典项的键和值在Form视图中

除法中如果除以完全因数需要更长时间吗?

在Swift中如何用变量计算0.9的立方

覆盖一个子元素的 HStack 对齐方式

ScreenCaptureKit/CVPixelBuffer 格式产生意外结果

从 Int 到 String 的属性更改引发 SwiftUI 视图不更新

这是 Int64 Swift Decoding 多余的吗?

为什么 performSegue() 不调用 shouldPerformSegue()

在 Select 器上显示alert Select SwiftUI

Alamofire 会自动存储 cookie 吗?

在 Swift 中返回实例类型

FirebaseStorage:如何删除目录

Swiftwhere数组扩展