1

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

我在Coco 绘图指南中读到可以创建新的图像表示。我是 Coca 和 Objectiv-C 编程的新手,关于这个主题,我发现Coco 绘图指南的解释非常简短,对我没有太大帮助。我现在有兴趣通过一些有关如何创建新图像表示的示例代码来获取更多详细信息。此外,我对了解如何覆盖 initWithData 和 Draw 方法以使 Cocoa 应用程序正确解释新的图像表示特别感兴趣。

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

4

1 回答 1

1

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

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

如果您真的想要一个 custom NSImageRep,那么您需要做的就是子类NSImageRep,然后在您的initWithData:方法中,您将图像数据存储在 ivar 中,然后调用所有各种方法来告诉图像代表它应该如何配置,例如-setBitsPerSample:等。该类-setPixelsHigh:的文档NSImageRep解释了在初始化图像时应该调用哪些方法。

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

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

但是,您最好直接NSBitmapImageRep在位图上下文中创建和操作像素(从 中返回-bitmapData)。然后你可以画出CGImageRep你可以从NSBitmapImageRep. 如果您NSBitmapImageRep在您的initWithData:方法中创建,您只需分配一次像素。

于 2011-11-18T00:44:07.793 回答