我试着塑造形象。逐像素。所以首先我建立了一个类,可以通过循环在每个像素绘制不同的颜色。但只有当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
这次阿尔法等于127。
和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中关于NSAlphaNonpremultipliedBitmapFormat
和NSImage
的章节。搜索“NSImage,CGImage,and CoreGraphics impedance matching”并开始阅读“NSBitmapImageRep:CoreGraphics impedance matching and performance notes”一节,这一节在这里最为相关。特别是最后一部分,有关于直接使用像素的重要信息。