Рендеринг NSView в изображение: cacheDisplayInRect рисует прозрачные области иначе, чем обычный вызов drawRect

Приветствую! У меня проблема, поиск в Google не дал результатов ...

Я реализовал метод drawRect для своего NSView (подкласса), чтобы рисовать тени и полупрозрачные заливки. Все отлично смотрится! Но теперь мне нужно создать NSImage из моего NSView (сделать снимок) для целей перетаскивания.

Он работает, но рисует иначе: темнее и не так контрастно, как должно быть.
Почему? Может из-за NSGraphicContext разные варианты? Нужна помощь и / или совет!

Вот код для получения NSImage из NSView:

- (NSImage *)makeImageSnapshot {

    NSSize imgSize = self.bounds.size;

    NSBitmapImageRep * bir = [self bitmapImageRepForCachingDisplayInRect:[self bounds]];
    [bir setSize:imgSize];

    [self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir];

    NSImage* image = [[[NSImage alloc] initWithSize:imgSize] autorelease];
    [image addRepresentation:bir];

    return image;
}

А вот изображения для визуального сравнения:

  1. Normal - отрисовывается обычным вызовом drawRect: http://cl.ly/image/213C1Y1V0v2H
  2. Плохо - записано в NSImage: http://cl.ly/image/183q442S2J14

Думал, разница может показаться очень небольшой, поверьте - при работе с приложением она очевидна. Я не понимаю, почему это происходит. И надеюсь, что кто-то может помочь ...

Заранее спасибо!


person UJey    schedule 23.08.2012    source источник
comment
Ваши ссылки мертвы. Не могли бы вы вернуть те изображения? Вероятно, лучше всего будет приложить их к самому вопросу. Спасибо!   -  person 7cows    schedule 27.05.2013
comment
Извините, я по ошибке удалил их навсегда   -  person UJey    schedule 27.05.2013


Ответы (1)


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

Попробуйте -dataWithPDFInsideRect: или -dataWithEPSInsideRect: и получите оттуда свои изображения.

person Joshua Nozzi    schedule 23.08.2012
comment
Спасибо, Джошуа! Проблема в том, что я визуализирую это изображение за пределами экрана, и оба этих метода создают недопустимое изображение, к тому же они работают медленно. Все другие известные мне способы создания снимка NSView не сохраняют прозрачность. Похоже, мне придется исправить drawRect для этого случая. - person UJey; 24.08.2012
comment
На заметку: dataWithPDFInsideRect невероятно медленный (openradar.appspot.com/21666422). чехол в macOS 11.4 (Big Sur) - person strangetimes; 15.06.2021