gpt4 book ai didi

swift - 当我在上面绘制文本时,NSImage 会调整大小

转载 作者:行者123 更新时间:2023-11-28 15:16:15 25 4
gpt4 key购买 nike

我有以下代码在 NSImage 上绘制文本。但是当我将生成的图像保存到磁盘时,生成的图像被调整为较小的图像。

我做错了什么?请指教

func drawText(image :NSImage) ->NSImage
{
let text = "Sample Text"
let font = NSFont.boldSystemFont(ofSize: 18)
let imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)

let textRect = CGRect(x: 5, y: 5, width: image.size.width - 5, height: image.size.height - 5)
let textStyle = NSMutableParagraphStyle.default().mutableCopy() as! NSMutableParagraphStyle
let textFontAttributes = [
NSFontAttributeName: font,
NSForegroundColorAttributeName: NSColor.white,
NSParagraphStyleAttributeName: textStyle
]

let im:NSImage = NSImage(size: image.size)

let rep:NSBitmapImageRep = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: Int(image.size.width), pixelsHigh: Int(image.size.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSCalibratedRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 0)!

im.addRepresentation(rep)

im.lockFocus()

image.draw(in: imageRect)
text.draw(in: textRect, withAttributes: textFontAttributes)

im.unlockFocus()

return im
}

最佳答案

这是一种不同的方法,使用临时 NSView 绘制图像和文本并将结果缓存在新图像中(代码为 Swift 4)。好处是你不需要处理像素

class ImageView : NSView  {

var image : NSImage
var text : String

init(image: NSImage, text: String)
{
self.image = image
self.text = text
super.init(frame: NSRect(origin: NSZeroPoint, size: image.size))
}

required init?(coder decoder: NSCoder) { fatalError() }

override func draw(_ dirtyRect: NSRect) {
let font = NSFont.boldSystemFont(ofSize: 18)
let textRect = CGRect(x: 5, y: 5, width: image.size.width - 5, height: image.size.height - 5)
image.draw(in: dirtyRect)
text.draw(in: textRect, withAttributes: [.font: font, .foregroundColor: NSColor.white])
}

var outputImage : NSImage {
let imageRep = bitmapImageRepForCachingDisplay(in: frame)!
cacheDisplay(in: frame, to:imageRep)
let tiffData = imageRep.tiffRepresentation!
return NSImage(data : tiffData)!
}
}

要使用它,初始化一个 View

let image = ... // get some image
let view = ImageView(image: image, text: "Sample Text")

并获取新图像

let imageWithText = view.outputImage

注意:

根本没有使用段落样式,但是如果你想创建一个可变的段落样式,就写

let textStyle = NSMutableParagraphStyle()

关于swift - 当我在上面绘制文本时,NSImage 会调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46804074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com