Обновление
Неважно: -)
Разобрался с помощью bitmapImageRepForCachingDisplayInRect
& cacheDisplayInRect:toBitmapImageRep:
.
Я оставлю здесь вопрос для потомков.
Я работаю над небольшим приложением, которое, помимо прочего, имеет подкласс NSView
, который рисует кучу bezierPaths.Я хотел бы иметь возможность сохранить нарисованный результат как EPS или PNG.
Вид рисуется в внеэкранном окне (по причинам масштабирования), и хотя он возвращает правильные данные EPS, яне могу получить от него никаких полезных растровых данных.
EPS не проблема (я просто записываю NSData
из -dataWithEPSInsideRect:
в файл), но я не могу получить PNGbitmap.
Если я попытаюсь вызвать:
[self lockFocus];
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:self.bounds];
[self unlockFocus];
return rep;
из метода категории, который я добавил в NSView, я получу из него бесполезные белые PNG-данные при попытке representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]
.
Странно, если я пытаюсь вызвать lockFocus / initBitmapWith ../ unlockFocus из вне представления (или его методов категории), я получаю исключение, говорящее о том, что представление или один из его предков скрыты,И да, это закадровое окно (кстати, закадровое окно было инициировано с отсрочкой: НЕТ, поэтому оно должно рисовать).
Так что я могу либо получить бесполезные данные, либо получить исключение.Не удивительно.
Чтобы добавить к моей путанице: если я создаю NSImage, содержащий представление EPS и (бесполезное) белое растровое изображение, где оба должны быть размером границ представления, растровое представление всегда равно 20пикселей / единиц уже, чем границы.Понятия не имею почему!EPS имеет правильный размер.
Поскольку все это может быть связано с созданием закадрового окна, вот код для этого (из категории NSView)
- (NSWindow*)placeInOffscreenWindow {
NSRect windowBounds = { { -1000.0 , -1000.0 } , self.bounds.size };
NSWindow *hiddenWindow = [[NSWindow alloc] initWithContentRect: windowBounds
styleMask: NSTitledWindowMask | NSClosableWindowMask
backing: NSBackingStoreNonretained
defer: NO];
[[hiddenWindow contentView] addSubview:self];
return hiddenWindow;
}
Любые идеи будутоценили!