奇怪的behive NSBitmapImageRep

时间:2015-09-05 19:17:46

标签: macos swift cocoa

我尝试构建图像。逐像素。所以首先我构建一些类,每个像素可以通过循环绘制不同的颜色。但是只有当alpha设置为255时才能正常工作。更改alpha会使颜色变暗并更改图片。尺寸和地点都可以。

 var rep:NSBitmapImageRep = NSBitmapImageRep(
                bitmapDataPlanes: nil,
                pixelsWide: width,
                pixelsHigh: height,
                bitsPerSample: 8,
                samplesPerPixel: 4,
                hasAlpha: true,
                isPlanar: false,
                colorSpaceName: NSDeviceRGBColorSpace,
                bytesPerRow: 0,
                bitsPerPixel: 0)!

 for posX in 0-offset...width+offset*2-1 {
      for  posY in  0-offset...height+offset*2-1 {

           var R = Int(Float(posX)/Float(width)*255)
           var G = Int(Float(posY)/Float(height)*255)
           var B = Int(rand() % 256)
           pixel = [R,G,B,alpha]
           rep.setPixel(&pixel, atX: posX, y: posY)
      }
 }

 rep.drawInRect(bounds)

Alpha = 255

alpha设置为255

Alpha = 250

alpha设置为196

Alpha 127

这次

alpha等于127。

alpha 63

64岁。

我哪里错了?

1 个答案:

答案 0 :(得分:2)

最可能的问题是你没有将alpha与颜色分量预乘。

来自NSBitmapImageRep class reference

  

Alpha预乘和位图格式

     

使用预乘格式创建位图时,如果是覆盖范围   (alpha)平面存在,位图的颜色分量被预乘   用它。在这种情况下,如果您修改位图的内容,那么   因此负责预乘数据。注意   预乘通常对输出质量的影响可以忽略不计。对于   浮点图像数据,预乘色彩成分是一个   无损操作,但对于定点图像数据,预乘   可以引入小的舍入误差。在任何一种情况下,更圆   合成许多预乘图像时可能会出现错误;然而,   这些错误通常不易察觉。

     

因此,如果您这样做,则不应使用NSBitmapImageRep对象   想要操纵图像数据。处理非数据   预乘,改为使用Core Graphics框架。 (特别,   使用CGImageCreate函数和kCGImageAlphaLast创建图片   参数。)或者,包括   创建位图时会NSAlphaNonpremultipliedBitmapFormat标记。

     
    

注意

         

使用bitmapFormat参数     initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:     指定创建位图的格式的方法。创建时或     使用其他方法检索位图,位图格式取决于     图像数据的原始来源。检查bitmapFormat属性     在处理图像数据之前。

  

您已使用-init...方法 bitmapFormat参数。在这种情况下,您需要查询结果对象的bitmapFormat,并确保构建像素值以匹配该格式。请注意,格式指示alpha在组件顺序中出现的位置,颜色组件是否由alpha预乘,以及组件是浮点还是整数。

您可以切换到使用具有-init...参数的bitmapFormat方法,并指定NSAlphaNonpremultipliedBitmapFormat混入您选择的其他标记(第一个或最后一个,整数或浮点数,字节顺序)。但请注意,并非所有可能的格式都支持绘图。

顺便说一下,我强烈建议您阅读10.6 AppKit release notes中有关NSImageNSBitmapImageRep的部分。搜索“NSImage,CGImage和CoreGraphics阻抗匹配”并开始阅读“NSBitmapImageRep:CoreGraphics阻抗匹配和性能注释”部分,这里最相关。特别是,最后一节有关于直接使用像素的重要信息。