我正在申请保持漫画书收藏井井有条。用户应该能够通过 ImageWell 将封面图稿的图像拖到程序中。
由于无法再次将图像拖出应用程序,因此我不需要将图片保存为原始大小。ImageWell 大小的图像就可以了。
问题是如何使用我的应用程序重新缩放图像?
更复杂的是,ImageWell 与 Core Data 绑定。所以我需要在 Core Data 将图片保存为原始大小之前重新缩放图像。
缩放图像的常用方法是在其上分配一个NSImage
具有所需较小尺寸的新图像lockFocus
,然后将原始图像绘制到NSImage
(unlockFocus
当然,当你完成时)。从那里,您可以使用 CoreGraphics API 或者,如果您的需要很简单,可以TIFFRepresentation
使用NSImage
.
至于处理核心数据,我建议将您的图像保存在一个单独的实体中,并与拥有它的对象有关系。原因是Core Data在获取时会一次性加载一个对象的所有数据,所以当你不需要图像数据(可能相当大,即使是小图像)时,你可以避免缓慢的性能和内存压力每次提取时将其加载到内存中。image
您可以根据需要在延迟加载/存储图像的主要实体上放置一个瞬态属性。
当您的图像很好地更新其与新图像的绑定时,这将是重新缩放图像并将其存储在数据对象中的绝佳机会。也就是说,您将通过绑定将完整大小的图像传递给数据对象,并且它将处理重新缩放。
想想 NSValueTransformer。价值转换器就是……它改变了价值。所以你希望你的图像调整大小(例如转换)和值转换器通过绑定工作。如果您查看接口构建器中的绑定,您会看到“Value Transformer”部分,这就是您将转换器挂钩的地方。Transformers 有两个主要的方法,一个transformedValue 方法和一个reverseTransformedValue 方法。第一个用于在图像视图中显示数据时使用,第二个用于相反的方向......当数据写入核心数据模型时。所以它们是核心数据和接口之间的进出方法。
因此,对于您的情况,您将在 reverseTransformedValue 方法中调整大小(如 Alex 解释的那样)。有关您需要执行的操作的更多详细信息和示例,请参见此处。