【发布时间】:2018-01-18 05:53:49
【问题描述】:
我已经搜索了各种 Apple 的文档和 StackOverflow 的答案,但没有任何帮助,仍然有一个空白的应用程序窗口。我正在尝试在 NSWindow 中显示像素缓冲区的内容,为此我分配了一个缓冲区:
UInt8* row = (UInt8 *) malloc(WINDOW_WIDTH * WINDOW_HEIGHT * bytes_per_pixel);
UInt32 pitch = (WINDOW_WIDTH * bytes_per_pixel);
// For each row
for (UInt32 y = 0; y < WINDOW_HEIGHT; ++y) {
Pixel* pixel = (Pixel *) row;
// For each pixel in a row
for (UInt32 x = 0; x < WINDOW_WIDTH; ++x) {
*pixel++ = 0xFF000000;
}
row += pitch;
}
这应该准备一个带有红色像素的缓冲区。然后我正在创建一个NSBitmapImageRep:
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(u8 *) row
pixelsWide:WINDOW_WIDTH
pixelsHigh:WINDOW_HEIGHT
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:WINDOW_WIDTH * 4
bitsPerPixel:32];
然后转换成NSImage:
NSSize imageSize = NSMakeSize(CGImageGetWidth([imageRep CGImage]), CGImageGetHeight([imageRep CGImage]));
NSImage *image = [[NSImage alloc] initWithSize:imageSize];
[image addRepresentation:imageRep];
然后我正在配置视图:
NSView *view = [window contentView];
[view setWantsLayer: YES];
[[view layer] setContents: image];
遗憾的是,这并没有给我预期的结果。
【问题讨论】:
-
您的最终目标是使用 CALayers(用于动画),还是只是想显示图像?我建议简化问题。首先,将内容视图从
NSView更改为NSImageView,然后只需设置image属性。 -
其他问题:
WIDTH==WINDOW_WIDTH和HEIGHT==WINDOW_HEIGHT?它们必须是,否则-initWithBitmapDataPlanes:...会产生垃圾。为什么pitch的初始化表达式会转换为指针? -
@JamesBucanek 谢谢,我试图简化 sn-p,因此写了这个垃圾,修复了。 CALayers 看起来是正确的方向,我相信我需要研究 Quartz 并使用
CGBitmapContextCreate,虽然不知道如何使这项工作 -
您将使用
CGBitmapContextCreate创建一个由字节数组缓冲区支持的图形上下文,以便您在该上下文中绘制的任何内容都将呈现为像素,然后您可以在数组中检查它们。这基本上与您要完成的目标相反。 -
@JamesBucanek 我不确定我是否理解,听起来这正是我需要的,我有一个字节/像素数组(即
row),我在每个周期都在填充/frame 然后在屏幕上渲染。我错过了什么吗?为什么是相反的方向?
标签: objective-c macos cocoa