我尝试构建图像。逐像素。所以首先我构建一些类,每个像素可以通过循环绘制不同的颜色。但是只有当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设置为196
这次alpha等于127。
64岁。
我哪里错了?
答案 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中有关NSImage
和NSBitmapImageRep
的部分。搜索“NSImage,CGImage和CoreGraphics阻抗匹配”并开始阅读“NSBitmapImageRep:CoreGraphics阻抗匹配和性能注释”部分,这里最相关。特别是,最后一节有关于直接使用像素的重要信息。