Возникли проблемы при создании растрового изображения PNG из NSView - PullRequest
0 голосов
/ 26 ноября 2010

Обновление
Неважно: -)
Разобрался с помощью 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;
}

Любые идеи будутоценили!

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Завершается, используя bitmapImageRepForCachingDisplayInRect: & cacheDisplayInRect:toBitmapImageRep: вместо

1 голос
/ 26 ноября 2010

Я предлагаю вам создать NSImage, заблокировать фокус на нем, сказать представлению нарисовать его границы и разблокировать фокус, затем попросить изображение создать CGImage , а затем передать его в CGImageDestination для записи данных / файла PNG.

...