【发布时间】:2015-11-26 00:42:25
【问题描述】:
我有两个 d 像素图([Double]),我将它们(正确)编码为 [UInt32]),它被输入到 CGDataProvider 中,它是 CGImage 的源,转换为 NSImage 并最终显示在带有
的自定义视图class SingleStepMapView:NSView {
@IBOutlet var dataSource : SingleStepViewController!
override func drawRect(dirtyRect: NSRect) {
let mapImage = TwoDPixMap(data: dataSource.mapData,
width: dataSource.mapWidth, color: dataSource.mapColor).image
mapImage.drawInRect(self.bounds, fromRect: NSZeroRect, operation: NSCompositingOperation.CompositeSourceAtop, fraction: 1.0)
return
}
构造 NSImage 的部分在 TwoDPixMap 实例的 image 属性中...
var image : NSImage {
var buffer = [UInt32]()
let bufferScale = 1.0 / (mapMax - mapMin)
for d in data {
let scaled = bufferScale * (d - mapMin)
buffer.append( color.rgba(scaled) )
}
let bufferLength = 4 * height * width
let dataProvider = CGDataProviderCreateWithData(nil, buffer, bufferLength, nil)!
let bitsPerComponent = 8
let bitsPerPixel = 32
let bytesPerRow = 4 * width
let colorSpace = CGColorSpaceCreateDeviceRGB()
var bitMapInfo = CGBitmapInfo()
bitMapInfo.insert(.ByteOrderDefault)
// let bitMapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue)
let interpolate = false
let renderingIntent = CGColorRenderingIntent.RenderingIntentDefault
let theImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitMapInfo, dataProvider, nil, interpolate, renderingIntent)!
let value = NSImage(CGImage: theImage, size: NSSize(width: width, height: height))
return value
}
我检查了创建的缓冲区值在输入到CGDataProviderCreateWithData 调用时总是正确的。特别是对于以下示例,它们是 64 个 Double 值(从 0.0 到 63.0),它们将使用我构建的彩条映射到 64 个 UInt32 值,以便第一个像素是纯红色( 0xff0000ff),最后一个像素是纯白色(0xffffffff)。在任何值中,我们都看不到任何转化为黑色的东西。当排列为 64 x 一张地图(本质上是颜色条)时,它应该看起来像这样......
但有时,只是重新调用 drawrect 方法,使用相同的数据和创建的缓冲区,它看起来完全错误
或有时几乎正确(一个像素错误的颜色)。我会发布更多示例,但仅限于两个链接
【问题讨论】:
标签: swift core-graphics quartz-2d