我试着塑造形象。逐像素。所以首先我建立了一个类,可以通过循环在每个像素绘制不同的颜色。但只有当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)

macos - 奇怪的 hive NSBitmapImageRep-LMLPHP
alpha设置为255
macos - 奇怪的 hive NSBitmapImageRep-LMLPHP
alpha设置为196
macos - 奇怪的 hive NSBitmapImageRep-LMLPHP
这次阿尔法等于127。
macos - 奇怪的 hive NSBitmapImageRep-LMLPHP
和64。
我错在哪里了?

最佳答案

最可能的问题是你没有预先将alpha与颜色组件相乘。
NSBitmapImageRep class reference开始:
Alpha预乘和位图格式
使用预乘格式创建位图时,如果覆盖率
(α)平面存在,位图的颜色分量是预乘的。
带着它。在这种情况下,如果修改位图的内容,则
因此要对数据的预乘负责。请注意
预乘对输出质量的影响通常可以忽略不计。为了
浮点图像数据,预乘颜色分量是
无损操作,但用于定点图像数据,预乘
会引入小的舍入误差。无论是哪种情况,更多的舍入
合成许多预乘图像时可能会出现错误;但是,
这样的错误通常不易察觉。
因此,如果
想要操作图像数据。使用非
预乘,使用核心图形框架代替。(具体来说,
使用NSBitmapImageRep功能和CGImageCreate创建图像
参数。)或者,包括
kCGImageAlphaLast创建位图时的标志。
注意
使用NSAlphaNonpremultipliedBitmapFormat参数
bitmapFormat
方法指定创建位图的格式。创建或
使用其他方法检索位图时,位图格式取决于
图像数据的原始源。检查initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:属性
在处理图像数据之前。
您使用了不带bitmapFormat参数的-init...方法。在这种情况下,您需要查询结果对象的bitmapFormat,并确保构建的像素值与该格式匹配。请注意,该格式指示alpha在组件顺序中的显示位置、颜色组件是否由alpha预乘,以及组件是浮点还是整数。
您可以切换到使用具有bitmapFormat参数的-init...方法,并指定bitmapFormat与您选择的其他标志(first或last、integer或floating point、endianness)混合。不过,请注意,并非所有可能的格式都支持绘图。
顺便说一下,我强烈建议阅读10.6 AppKit release notes中关于NSAlphaNonpremultipliedBitmapFormatNSImage的章节。搜索“NSImage,CGImage,and CoreGraphics impedance matching”并开始阅读“NSBitmapImageRep:CoreGraphics impedance matching and performance notes”一节,这一节在这里最为相关。特别是最后一部分,有关于直接使用像素的重要信息。

10-08 09:24