【问题标题】:Cocoa : Scale Image dragged into an ImageWellCocoa:缩放图像拖入 ImageWell
【发布时间】:2025-12-26 07:00:16
【问题描述】:

我正在申请保持漫画书收藏井井有条。用户应该能够通过 ImageWell 将封面艺术作品的图像拖到程序中。

由于无法再次将图像拖出应用程序,因此我不需要将图片保存为原始大小。 ImageWell 大小的图像就可以了。

问题是如何使用我的应用程序重新缩放图像?

为了让事情变得更加复杂,ImageWell 绑定了 Core Data。所以我需要在 Core Data 将图片保存为原始大小之前重新缩放图像。

【问题讨论】:

    标签: cocoa image core-data rescale


    【解决方案1】:

    缩放图像的常用方法是分配一个具有所需较小尺寸的新NSImagelockFocus,然后将原始图像绘制到NSImage(完成后unlockFocus,当然)。从那里,您可以使用 CoreGraphics API 或者,如果您的需求很简单,可以使用 NSImage 上的 TIFFRepresentation 方法以各种格式序列化图像。

    至于处理核心数据,我建议将图像保存在与拥有它的对象相关的单独实体中。原因是Core Data在获取时会一次性加载一个对象的所有数据,所以当你不需要图像数据(可能非常大,即使是小图像)时,你可以避免缓慢的性能和内存压力每次提取时将其加载到内存中。您可以在主实体上放置一个瞬态 image 属性,以便根据需要延迟加载/存储图像。

    当您的图像很好地更新其与新图像的绑定时,这将是重新缩放图像并将其存储在数据对象中的绝佳机会。也就是说,您将通过绑定将完整大小的图像传递给数据对象,并由它处理重新缩放。

    【讨论】:

      【解决方案2】:

      想想 NSValueTransformer。价值转换器就是……它改变了价值。所以你希望你的图像调整大小(例如转换)和值转换器通过绑定工作。如果您查看接口生成器中的绑定,您将看到“Value Transformer”部分,这就是您将转换器挂钩的地方。Transformers 有两个主要的方法,一个transformedValue 方法和一个reverseTransformedValue 方法。第一个用于在图像视图中显示数据时使用,第二个用于相反的方向......当数据写入核心数据模型时。所以它们是核心数据和接口之间的进出方法。

      因此,对于您的情况,您可以在 reverseTransformedValue 方法中调整大小(正如 Alex 解释的那样)。请参阅here 了解更多详细信息和您需要执行的操作示例。

      【讨论】: