我试着塑造形象。一个像素一个像素。首先,我建立了一个类,它可以在每个像素上通过循环绘制不同的颜色。但是,只有当alpha设置为255时,它才能很好地工作。改变阿尔法会使颜色变暗,改变图片。大小和位置都可以。
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)

阿尔法设置为255

阿尔法设置为196

这次阿尔法等于127。

和64。
我哪里错了?
发布于 2015-09-05 20:31:55
最可能的问题是,您没有将alpha与颜色成分相乘。
来自类引用
Alpha预乘和位图格式 当使用预乘格式创建位图时,如果存在覆盖(alpha)平面,则位图的颜色分量将与其进行预乘。在这种情况下,如果您修改位图的内容,那么您将负责对数据进行预乘。注意,预乘对产出质量的影响一般可以忽略不计。对于浮点图像数据,预乘颜色分量是一种无损运算,而对于定点图像数据,预乘可以带来较小的舍入误差。在这两种情况下,在合成许多预相乘图像时可能会出现更多的舍入错误;然而,这种错误通常是不可见的。 因此,如果要操作图像数据,则不应使用
NSBitmapImageRep对象。若要处理未乘以的数据,请使用Core框架。(具体来说,使用CGImageCreate函数和kCGImageAlphaLast参数创建图像。)或者,在创建位图时包括NSAlphaNonpremultipliedBitmapFormat标志。 Note 使用bitmapFormat参数对initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:方法指定创建位图的格式。使用其他方法创建或检索位图时,位图格式取决于图像数据的原始源。在处理图像数据之前检查bitmapFormat属性。
您使用了不带-init...参数的bitmapFormat方法。在这种情况下,您需要查询结果对象的bitmapFormat,并确保构建像素值以匹配该格式。请注意,该格式指示alpha以组件顺序出现的位置,颜色组件是否被alpha乘以,以及组件是浮点还是整数。
您可以切换到使用具有-init...参数的bitmapFormat方法,并将NSAlphaNonpremultipliedBitmapFormat与您选择的其他标志(第一个或最后一个、整数或浮点数、endianness)混合起来。但是,请注意,并非所有可能的格式都支持绘图。
顺便提一下,我强烈建议阅读关于NSImage和NSBitmapImageRep在10.6 AppKit发行说明中的部分。搜索"NSImage、CGImage和CoreGraphics阻抗匹配“,然后开始阅读"NSBitmapImageRep: CoreGraphics阻抗匹配和性能说明”一节,这是这里最相关的部分。特别是最后一节,有关于直接处理像素的重要信息。
https://stackoverflow.com/questions/32416828
复制相似问题