objective-c - 如何实现 NSImage 的自定义图像表示

标签 objective-c cocoa nsimage nsimagerep

我正在开发一个应用程序来绘制和处理 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/

相关文章:

cocoa - 切换 XIB View - Cocoa Mac

cocoa - 不带子域的 NSURL 的主机

objective-c - 简单的程序在 90 分钟左右后停止

objective-c - 如何从组合 TIFF 中获取合适的 CGImage 用于显示比例

objective-c - 在 Objective-C 中以编程方式创建图像

ios - 向 UIImagepickercontroller 导航栏添加后退按钮

iphone - 在 iOS 中将线性 PCM 文件转换为 M4A 文件

objective-c - CoreData - 如何在一对多关系中添加多个对象

iphone - 在 Objective-C 中生成具有随机数长度的随机数

Swift读写图片占用大量内存