gpt4 book ai didi

ios - 调整(缩小)NSImage 的大小会稍微改变 RGB 值。如何保留原始 RGB 值?

转载 作者:行者123 更新时间:2023-11-30 12:48:11 25 4
gpt4 key购买 nike

我正在开发一个项目,需要来自 NSImage 的原始 RGB 值。将全红色图像(PNG 图像)(RGB: 255,0,0) 缩小到 200X200 的大小时,我得到的 RGB 值略有不同 (RGB: 251, 0, 7)。调整大小代码和像素提取代码在下面。我有两个问题。使用下面的代码调整 NSImage 大小时这是预期的行为吗?是否可以保留图像的原始RGB值(缩小之前存在的RGB值)?

调整大小代码 (credit) :

open func resizeImage(image:NSImage, newSize:NSSize) -> NSImage{

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

rep?.size = newSize

NSGraphicsContext.saveGraphicsState()
let bitmap = NSGraphicsContext.init(bitmapImageRep: rep!)
NSGraphicsContext.setCurrent(bitmap)
image.draw(in: NSMakeRect(0, 0, newSize.width, newSize.height), from: NSMakeRect(0, 0, image.size.width, image.size.height), operation: .sourceOver, fraction: CGFloat(1))

let newImage = NSImage(size: newSize)
newImage.addRepresentation(rep!)
return newImage

}

我用来从 NSImage 中提取 RGB 值的代码如下:

RGB提取代码(credit) :

extension NSImage {

func pixelData() -> [Pixel] {
var bmp = self.representations[0] as! NSBitmapImageRep
var data: UnsafeMutablePointer<UInt8> = bmp.bitmapData!
var r, g, b, a: UInt8
var pixels: [Pixel] = []

NSLog("%d", bmp.pixelsHigh)
NSLog("%d", bmp.pixelsWide)
for var row in 0..<bmp.pixelsHigh {
for var col in 0..<bmp.pixelsWide {
r = data.pointee
data = data.advanced(by: 1)
g = data.pointee
data = data.advanced(by: 1)
b = data.pointee
data = data.advanced(by: 1)
a = data.pointee
data = data.advanced(by: 1)
pixels.append(Pixel(r: r, g: g, b: b, a: a))
}
}

return pixels
}
}

class Pixel {

var r: Float!
var g: Float!
var b: Float!

init(r: UInt8, g: UInt8, b: UInt8, a: UInt8) {
self.r = Float(r)
self.g = Float(g)
self.b = Float(b)
}

}

最佳答案

感谢@KenThomases,该问题已得到解决。调整 NSImage 大小时,我将 NSBitmapImageRep 对象的颜色空间设置为 NSCalibrateRGBColorSpace。缩小之前的原始 NSImage 具有与缩小后的图像不同的色彩空间名称。色彩空间的简单改变就产生了正确的结果。 NSCalibrateRGBColorSpace 已更改为 NSDeviceRGBColorSpace

关于ios - 调整(缩小)NSImage 的大小会稍微改变 RGB 值。如何保留原始 RGB 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41352067/

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