我正在开发一个应用程序来绘制和处理 NSimage 类当前不支持的特定图像格式。在这种特定格式中,图像采用一维二进制表的形式,前面是描述数据的 ASCII header (数字尺寸、图像大小、每像素位数……)。
我在 Coco Drawing Guide 中读到可以创建新的图像表示。我是 Coca 和 Objectivev-C 编程的新手,在这个主题上,我找到了 Coco Drawing Guide解释很短,对我没有多大帮助。我现在有兴趣通过一些示例代码获取有关如何创建新图像表示的更多详细信息。另外,我特别有兴趣了解如何覆盖 initWithData 和 Draw 方法,以便 Cocoa 应用程序正确解释新的图像表示。
有谁知道与我分享一个链接,其中更详细地描述了该方法?
最佳答案
如果您只想绘制图像格式并且并不特别关心将其再次从应用程序中传回,那么您最好忘记子类化 NSImageRep
并只创建一个 NSBitmapImageRep
,其位深度和尺寸与您的图像匹配。然后,您向它询问其-bitmapData
。
这将为您提供一个可以直接寻址的原始缓冲区,然后您可以将图像的每个像素逐一复制到缓冲区中的适当位置。
如果您确实想要自定义 NSImageRep
,那么您需要做的就是子类 NSImageRep
,然后在您的 initWithData:
方法中将图像数据存储在 ivar 中,然后调用所有各种方法来告诉图像代表应如何配置它,例如 -setBitsPerSample:
、-setPixelsHigh:
等.NSImageRep
类的文档解释了初始化图像时应调用哪些方法。
要实现-draw
,您实际上需要在当前上下文中绘制像素。显然,如何执行此操作取决于您正在绘制的图像类型(例如,矢量格式的绘制代码与位图格式的绘制代码非常不同)。
绘制位图图像的一种方法是循环遍历像素并为每个像素调用一个像素大小的矩形,这虽然不是特别高效,但速度相当快。
但是,您最好创建一个 NSBitmapImageRep
并直接操作位图上下文中的像素(从 -bitmapData
返回)。然后,您可以绘制从 NSBitmapImageRep
获取的 CGImageRep
。如果您在 initWithData:
方法中创建 NSBitmapImageRep
,则只需分配像素一次。
关于objective-c - 如何实现 NSImage 的自定义图像表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174281/