NSImage → NSURL → Пользовательский объект - PullRequest
1 голос
/ 10 ноября 2011

Мое приложение пытается создать пользовательские объекты из объектов NSImage (поступающих из монтажной панели), но мой текущий процесс принимает только URL-адреса изображений.

Я бы хотел избежать серьезных изменений на этом этапе, поэтому мне было интересно, есть ли способ получить URL-адрес NSImage (кажется разумным ожиданием, поскольку можно инициализировать NSImage с URL-адреса )

Спасибо.

РЕДАКТИРОВАТЬ (ответ)

Я пошел немного другим путем. Вместо того, чтобы получать содержимое монтажной панели в виде массива NSImage, я просто получил его в виде массива NSURL. Затем я могу использовать их в своем процессе.

    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    NSArray *classArray = [NSArray arrayWithObject:[NSURL class]];
    NSDictionary *options = [NSDictionary dictionary];

    BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options];
    if (ok) {
        NSArray *URLs = [pasteboard readObjectsForClasses:classArray options:options];
    }

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Если изображение доставляется через стандартный монтажный картон (т.е. механизм копирования / вставки), то нет способа ссылаться на него по URL, потому что оно может не иметь его.Например, если вы открываете документ в Word или Pages, выбираете изображение и копируете его, невозможно создать URL-ссылку на это изображение.Он находится на монтажном столе, но не в файловой системе в форме, к которой вы можете получить доступ.

Я думаю, что вам придется изменить свой код для непосредственной обработки NSImage объектов.

1 голос
/ 10 ноября 2011

Цитата от BlazingFrog:

(кажется разумным ожиданием, поскольку можно инициализировать NSImage с URL-адреса)

Допустим, я инициализировал NSStringиспользуя:

NSString * theString = [NSString initWithContentsOfURL: encoding: error: ];

Я уверен, что невозможно извлечь оригинал NSURL из NSString.
И я совершенно уверен, что то же самое относится к NSImage.(На самом деле, полностью уверен.)

Действительно NSImage может быть инициализирован с помощью initWithContentsOfURL:.
Но он также может быть инициализирован с помощью initWithData: или initWithPasteboard:.
NSURLнет строгих требований для инициализации NSImage.
Другими словами, NSImage может быть инициализирован без использования URL.
NSImage - это просто контейнер для представлений изображений.

Цитата от Apple:

Объект NSImage управляет группой представлений изображений.

Решения

  1. Измените ваш 'процесс', чтобы принять NSImage.
  2. Записать NSImage во временный файл и использовать этот путь к файлу.
...