Ios 调整大小(缩小比例)NSImage会略微更改RGB值。如何保留原始RGB值?

Ios 调整大小(缩小比例)NSImage会略微更改RGB值。如何保留原始RGB值?,ios,swift,cocoa,image-processing,Ios,Swift,Cocoa,Image Processing,我有一个项目,我正在工作,需要从NSImage原始RGB值。当将完全红色的图像(PNG图像)(RGB:255,0,0)缩小到200X200时,我得到的RGB值略有不同(RGB:251,0,7)。下面是调整大小代码和像素提取代码。我有两个问题。使用下面的代码调整NSImage的大小时,这是预期的行为吗?是否可以保留图像的原始RGB值(降尺度之前存在的RGB值) 调整大小代码: 我用于从NSImage提取RGB值的代码如下所示: RGB提取代码: 扩展NSImage{ func pixelData(

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

调整大小代码:

我用于从NSImage提取RGB值的代码如下所示:

RGB提取代码:

扩展NSImage{
func pixelData()->[像素]{
var bmp=self.representations[0]为!NSBitmapImageRep
变量数据:unsafemeutablepointer=bmp.bitmapData!
变量r、g、b、a:UInt8
变量像素:[像素]=[]
NSLog(“%d”,bmp.pixelsHigh)
NSLog(“%d”,bmp.pixelsWide)

对于0..中的var行,此问题已解决,原因是。在调整NSImage的大小时,我将NSBitmapImageRep对象的颜色空间设置为
NSCalibratedRGBColorSpace
。降尺度之前的原始NSImage的颜色空间名称与降尺度图像的颜色空间名称不同。颜色空间的简单更改可产生正确的结果
NSCalibratedRGBColorSpace
已更改为
NSDeviceRGBColorSpace

您正在使用
NSCalibratedRGBColorSpace
创建位图图像rep。原始图像rep的
colorSpaceName
是什么?不同的像素值可能表示相同的颜色(尽可能接近)当通过各自的颜色空间进行解释时。@Kenthomass从原始图像的NSBitMapRep打印颜色空间时,我得到了:sRGB IEC61966-2.1 colorspace,如果在调用中使用
colorSpaceName
的值来创建位图图像rep,会发生什么?好的,我想我修复了第一个com中的提示问题ment。将颜色空间更改为NSDeviceGBColorSpace现在为我提供了正确的值。:)调整大小的图像的颜色空间为:通用RGB颜色空间。显然存在差异。非常感谢您的帮助@Kenthomase
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

}
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)
    }

}