Визуализация NSView, содержащего некоторые CALayers, в NSImage - PullRequest
6 голосов
/ 23 декабря 2010

У меня есть NSView, который содержит NSScrollView, содержащий поддерживаемый CALayer NSView.Я попробовал все обычные методы захвата NSView в NSImage (используя -dataWithPDFInsideRect, NSBitmapImageRep's -initWithFocusedViewRect и т. Д.). Однако все эти методы обрабатывают поддерживаемый CALayer NSView, как если бы он не существовал.Я уже видел эту публикацию StackOverflow, но это был вопрос о рендеринге только дерева CALayer для изображения, а не NSView, содержащего как обычные NSView, так и представления на основе слоев.

Любая помощь приветствуется, спасибо:)

Ответы [ 4 ]

6 голосов
/ 30 декабря 2010

Единственный способ сделать это - использовать API CGWindow, что-то вроде:

CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);

затем вырежьте ту часть CGImage, которая соответствует вашему взгляду, с помощью

-imageByCroppingToRect.

Затем сделайте NSImage из обрезанного CGImage. Имейте в виду, что это не будет хорошо работать, если части этого окна находятся за пределами экрана.

2 голосов
/ 03 января 2011

Это работает для рисования вида непосредственно в NSImage, хотя я не пробовал его с представлением со слоистой поддержкой:

NSImage * i = [[NSImage alloc] initWithSize:[view frame].size];
[i lockFocus];
if ([view lockFocusIfCanDrawInContext:[NSGraphicsContext currentContext]]) {
  [view displayRectIgnoringOpacity:[view frame] inContext:[NSGraphicsContext currentContext]];
  [view unlockFocus];
}
[i unlockFocus];

NSData * d = [i TIFFRepresentation];
[d writeToFile:@"/path/to/my/test.tiff" atomically:YES];
[i release];
0 голосов
/ 01 февраля 2011

Пожалуйста, взгляните на ответ на этот пост: Как отобразить представление, содержащее слои Core Animation, в растровое изображение?

Этот подход работал для меня при тех же обстоятельствах, что и у вас.

0 голосов
/ 03 января 2011

Вы смотрели на предложения в руководстве по рисованию какао?( «Создание растрового изображения» )

Чтобы нарисовать непосредственно в растровое изображение, создайте новый объект NSBitmapImageRep с нужными параметрами и используйте graphicsContextWithBitmapImageRep: метод NSGraphicsContext для созданияконтекст рисования.Сделайте новый контекст текущим контекстом и нарисуйте.Этот метод доступен только в Mac OS X v10.4 и новее.Кроме того, вы можете создать объект NSImage (или внеэкранное окно), нарисовать в нем, а затем захватить содержимое изображения.Этот метод поддерживается во всех версиях Mac OS X.

Это звучит похоже на решение iOS, с которым я знаком (используя UIGraphicsBeginImageContext и UIGraphicsGetImageFromCurrentImageContext), поэтому я ожидаю, что оно будет работать для вашего представления.

...