如何在OSX应用程序中绘制像素?

时间:2014-02-06 14:34:43

标签: objective-c macos cocoa

我有一个表示像素数据的文件 - 它是自定义格式,因此我需要读取表示构成图像的每个像素的RGB数据的各个字节。我知道怎么做。

我使用什么类可以让我指定构成图像的各个像素,然后让我在应用程序的窗口中渲染它

我假设有某种“图像”对象,我可以在其中指定单个像素?

以下是我认为我需要做的事情: 1.在Xcode中创建一个Cocoa应用程序。 2.然后在默认创建的窗口中,我必须能够添加某种“视图”,在其中我可以渲染“图像”。 3.在那个“图像”中,我应该能够为代表“图像”的矩形中的每个像素指定RGB值。

我从哪里开始?我很乐意使用Objective-C进行编码,但我从来没有用UI编写应用程序,或者我不得不编写自定义绘图代码。

2 个答案:

答案 0 :(得分:2)

如果字节采用CoreGraphics识别的格式,您可以简单地将字节读入像NSData这样的缓冲区,并从中创建位图图像。你可以显示这个图像。例如:

unsigned char *fftFrames = (unsigned char *) [imageData bytes]; // data from a FFT operation on sound; grayscale in original; i want color.

unsigned char *imgData[3];
imgData[0] = &fftFrames[(int)start];
imgData[1]=imgData[0]+((int)width*(int)height);
imgData[2]=imgData[1]+((int)width*(int)height);

NSBitmapImageRep *sonagramImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:imgData 
    pixelsWide:*size 
    pixelsHigh:height
    bitsPerSample:8
    samplesPerPixel:3
    hasAlpha:NO
    isPlanar:YES
    colorSpaceName:NSDeviceRGBColorSpace
    bytesPerRow:width bitsPerPixel:8];

在上面的示例中,数据来自fft操作的灰度,然后我复制原始数据以填充红色,绿色和蓝色,以便稍后执行一些不错的CIFilter。最后我得到一个这样的图像:http://www.ecoobs.com/img/her-bcAn2-Ft3.png(左侧窗口中鲜艳的图像以这种方式生成,称为声音)。

它直接绘制到NSView

以上只是一种方式。使用Quartz可以非常类似地完成它。方法是一样的。

答案 1 :(得分:0)

也许看看NetPBM,您可以轻松地将数据转换为NetPBM格式,然后使用您喜欢的任何程序进行渲染或转换为其他格式。

文档here

以下是4x图像的示例文件 - 您可以看到它是ASCII并且易于读/写:

P3
# feep.ppm
4 4
15
0  0  0    0  0  0    0  0  0   15  0 15
0  0  0    0 15  7    0  0  0    0  0  0
0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0