如何为NSImage实现自定义图像表示

时间:2011-11-17 21:04:56

标签: objective-c cocoa nsimage nsimagerep

我正在开发一个应用程序来绘制和处理NSimage类当前不支持的特定图像格式。在这种特定格式中,图像是以1D二进制表的形式,前面是ASCII标题,用于描述数据(数字维度,图像大小,每像素位数......)。

我在Coco Drawing Guide中读到可以创建新的图像表示。我是Coca和Objectiv-C编程的新手,在这个主题上,我发现Coco Drawing Guide的解释非常简短,对我来说并没有那么有用。我现在有兴趣通过一些关于如何创建新图像表示的示例代码来获取更多细节。另外,我特别感兴趣的是了解如何覆盖initWithData和Draw方法,以便Cocoa应用程序正确地解释新的图像表示。

有没有人知道与我分享更详细描述方法的链接?

1 个答案:

答案 0 :(得分:1)

如果您要做的只是绘制图片格式而不是特别关心再次将其从应用程序中传回,那么您最好忘记继承NSImageRep的子类并只创建一个{{ 1}}具有与您的图像匹配的位深度和尺寸。然后你问它NSBitmapImageRep

这将为您提供一个可以直接寻址的原始缓冲区,然后您可以将图像中的每个像素逐个复制到缓冲区中的相应位置。

如果您确实需要自定义-bitmapData,那么您需要做的只是子类NSImageRep,然后在NSImageRep方法中将图像数据存储在ivar中然后调用所有各种方法来告诉图像代表应如何配置它,例如initWithData:-setBitsPerSample:等。-setPixelsHigh:类的文档说明在初始化时应调​​用哪些方法。图像。

要实现NSImageRep,您需要在当前上下文中绘制像素。显然,你如何做到这一点取决于你正在绘制的图像类型(例如,矢量格式与位图的绘图代码非常不同)。

绘制位图图像的一种方法是循环遍历像素,并为每个像素调用-draw一个像素大小的矩形,虽然效率不高,但速度非常快。

但是,您最好直接创建NSRectFill()并操纵位图上下文中的像素(从NSBitmapImageRep返回)。然后,您可以从-bitmapData绘制可以获得的CGImageRep。如果您在NSBitmapImageRep方法中创建NSBitmapImageRep,则只需分配一次像素。