【问题标题】:How to Implement Custom Image representation for NSImage如何为 NSImage 实现自定义图像表示
【发布时间】:2011-11-17 21:04:56
【问题描述】:

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

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

有没有知道的可以分享一个链接,里面详细介绍了这个方法?

【问题讨论】:

    标签: objective-c cocoa nsimage nsimagerep


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。我仍然对 NSImageRep 感兴趣,因为就术语而言,我正在编写的应用程序将对图像执行数据处理和分析,而不仅仅是绘图。但现在,我一步一步地从图像的绘图表示开始。无论如何,考虑细节。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多