Попытка превратить [NSImage imageNamed: NSImageNameUser] в NSData - PullRequest
8 голосов
/ 05 октября 2011

Если я создам NSImage через что-то вроде:

NSImage *icon = [NSImage imageNamed:NSImageNameUser];

, у него есть только одно представление, NSCoreUIImageRep, которое кажется частным классом.

Я быЯ хотел бы заархивировать это изображение как NSData, но если я попрошу TIFFRepresentation, я получу маленькую иконку, когда реальный NSImage, который я первоначально создал, казался векторным и увеличился, чтобы хорошо заполнить мои изображения.

Я надеялся, что у изображений, сделанных таким образом, будет NSPDFImageRep, который я мог бы использовать.

Любые идеи, как я могу получить NSData (перед векторной версией или, что хуже, крупномасштабное растровое изображениеверсия) этой NSImage?

ОБНОВЛЕНИЕ

Поговорили с некоторыми людьми в Твиттере , и они предположили, что реальный источник этих изображенийфайлы с несколькими разрешениями (возможно, не векторные).Я не мог найти их расположение на диске, но тем не менее интересно было услышать.

Кроме того, они предложили мне создать системный NSImage и вручную преобразовать его в собственный NSImage с высоким разрешением.Я делаю это сейчас, и это работает для моих нужд.Мой код:

+ (NSImage *)pt_businessDefaultIcon
{
    // Draws NSImageNameUser into a rendered bitmap. 
    // We do this because trying to create an NSData from 
    // [NSImage imageNamed:NSImageNameUser] directly results in a 32x32 image.
    NSImage *icon = [NSImage imageNamed:NSImageNameUser];
    NSImage *renderedIcon = [[NSImage alloc] initWithSize:CGSizeMake(PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize)];
    [renderedIcon lockFocus]; 
    NSRect inRect = NSMakeRect(0, 0, PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize);
    NSRect fromRect = NSMakeRect(0, 0, icon.size.width, icon.size.width);;
    [icon drawInRect:inRect fromRect:fromRect operation:NSCompositeCopy fraction:1.0];
    [renderedIcon unlockFocus];

    return renderedIcon;
}

(пытался опубликовать это как мой ответ, но мне не хватает репутации?)

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Вы, похоже, игнорируете документацию.На оба ваших главных вопроса есть ответы. Руководство по рисованию какао (сопутствующее руководство, связанное со ссылкой на API-интерфейс NSImage) содержит раздел «Изображения», который вам действительно необходимо внимательно прочитать и обращаться к любым случаям, когда у вас возникают проблемы с rep / caching / sizing / size / quality.

... если я запрашиваю TIFFRepresentation, я получаю маленькую иконку, когда реальный NSImage, который я первоначально создал, казался векторным и увеличивался, чтобы красиво заполнить мои изображения.

Соответствующие подразделы раздела Изображения для этого вопроса: как выбирается представление изображения, изображения и кэширование, а также размер и разрешение изображения.По умолчанию параметр -cacheMode для изображения TIFF «ведет себя так, как если бы действовал параметр NSImageCacheBySize».Кроме того, для операций масштабирования / изменения в памяти важна -imageInterpolation: «В таблице 6-4 перечислены доступные параметры интерполяции».и «NSImageInterpolationHigh - медленная, высококачественная интерполяция».

Я вполне уверен, что это относится к именованному образу системы, а также к любому другому.

Я надеялся, что на изображениях, сделанных [путем загрузки изображения с диска], будет NSPDFImageRep, который я мог бы использовать.

Соответствующий подраздел: Представления изображений.«... при использовании файловых изображений большинству создаваемых изображений требуется только одно представление изображений».и «Однако вы можете создать несколько представлений в следующих ситуациях: для печати может потребоваться создать представление PDF или растровое изображение вашего изображения с высоким разрешением».

Вы получаете представление, которое соответствует загруженному изображению,Например, вы должны создать PDF-представление для изображения TIFF.Чтобы сделать это с высоким разрешением, вам нужно будет вернуться к режиму кэширования, чтобы вы могли получать предметы с более высоким разрешением.

* * * * * * * * * * * * * * * * - это слишком много мелких деталей.из-за большого количества перестановок изображений / механизмов создания / настроек / и того, что вы хотите со всем этим делать.Мой пост предназначен для общего ознакомления с информацией, необходимой для вашей ситуации.

Для более подробной информации добавьте конкретные детали: код, который вы пытались использовать, тип изображения, которое вы загружаете или создаете - вы, кажется, упомянули две разные возможности в своем четвертом абзаце - и что пошло не так.

0 голосов
/ 05 октября 2011

Я бы предположил, что изображение каким-то образом "жестко запрограммировано" в графической системе, и его представление NSImage - просто число, указывающее, какой графической программой оно является.Скорее всего, вам нужно нарисовать его и затем захватить чертеж.

В общем случае создайте контроллер представления, который будет визуализировать изображение, ссылаясь на свойство view VC, чтобы вызвать визуализацию видаизвлеките contentView из VC, получите contentView.layer, визуализируйте layer в контекст UIGraphics, получите UIImage из контекста, извлеките любое представление, которое вы хотите из UIImage.

(Там может быть более простой способ, но это тот, который я использовал в одном случае.)

(И, вздох, я полагаю, эта схема также не сохраняет масштабирование.)

...