Украсить скриншоты с NSStrings внутри NSImage - PullRequest
0 голосов
/ 16 января 2012

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

К сожалению, выходной файл - моя строка на черном фоне без каких-либо признаков скриншота.

Это код:

NSImage *screenshot = [[NSImage alloc] initWithData:[mView dataWithPDFInsideRect:[mView bounds]]];

NSString *frameCounterString = @"123";
[screenshot lockFocus];
[frameCounterString drawAtPoint:NSMakePoint(10, 10) withAttributes:nil];
[screenshot unlockFocus];

Есть идеи, что происходит?

Запись изображения напрямую, т. Е. Отсутствие рисования строк дает ожидаемый результат (= скриншот в файле).

Как только вызовы lockFocus / unlockFocus добавляются, результат становится черным.

Использование NSBitmapImageRep: initWithFocusedViewRect: методика захвата также не работает в этом случае, т. Е .:

  screenshot = [[NSImage alloc] initWithSize:[mView bounds].size];
  [mView lockFocus];
  NSBitmapImageRep *bits = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[mView bounds]];
  [mView unlockFocus];
  [screenshot addRepresentation:bits];

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Прямо сейчас - теперь сочетаем несколько NSImage, как предложено в документации Apple.Один для скриншота, чем рисование с добавлением строки в новый пустой NSImage.

Все еще черный.

Захваченное представление содержит NSImageView, и оно должно быть чем-то вроде его внутренних представлений изображений: установка для границы NSImageView значения none никогда не приводит к скриншоту.Установка границы на «Фото» позволяет захватывать ее с помощью метода dataWithPDFInsideRect.

Необходимо найти более общий способ захвата, независимо от режима отображения.

0 голосов
/ 17 января 2012

Я не уверен, почему это не сработает (вы можете сообщить об ошибке ), но вместо этого я бы предложил следующее:

  1. Создайте новый NSImage нужного размера.
  2. Заблокируйте на нем фокус.
  3. Скажите вид display.
  4. Нарисуйте строку.
  5. Разблокировать фокус.
...