Вобщем я решил конкретно разобраться с этим вопросом. Я его уже кучу раз оговаривал, но мало-ли что, может кто что узнал и все пучком.
Суть: Необходимо отрендерить с помощью WPF картинку с помощью видеокарты, затем скопировать полученный результат из видеокарты в оперативную память. Есть официальный вариант RenderTargetSource, или как его там, но он рендерит процессором - медленно.
Все, до чего я докопался, это жуткий хак через DirectX, который подменяет функцию создания, вроде бы сурфейса, на свою. В своей создаешь свой сурфейс, отдаешь WPF, он рисует, дальше копируешь с сурфейса. Но у этого способа есть фатальные недостатки:
1) Чтобы это чудо отрисовывалось, нужно создавать окно. В любом случае. Причем видимое. Приходится делать ShowInTaskbar = false и выпихивать за пределы экрана. Если так не сделать, отрисовываться ничего не будет.
2) WPF отрисовывает все это дело когда хочет, а не когда надо. Отсюда стабильных плавных кадров хрен дождешься. Я научился управлять внутренним временем (уже не помню как, но повторить легко путем запихивания исходников Framework в программу Reflector - там найти скрытый статический класс времени, к которому можно обратиться через Reflection). Да, я управляю временем WPF. Выставляю, скажем, 1 секунду. А вот чтобы он эту секунду отрисовать - это он уже сам решает. Нужно эту сволочь как-то заставить самому рисовать.
В новом .NET 4 появился CachedBitmap, который кэширует отрисованную хрень в памяти видеокарты для ускорения работы. Может можно как-то с помощью него выципить изображение?
И вообще, есть какой-нибудь нормальный способ получения картинки с WPF?
В идеале хочется чего-то примерно такого:
var c = new WPFCapturer();
Bitmap bmp = c.Capture(grid1, 640, 480);
При этом метод Capture сам вызывает отрисовку grid1 на видеокарте, копирует результат в ОЗУ и отдает результат. Если вдобавок ко всему не надо будет делать костыль в виде видимого заныканного окна, то будет просто супер.
С моими знаниями только через translate.google.ru. Во всяком случае, мой перевод будет не лучше Не, я не думаю, что-то там найду. Тот пример с подменой адреса функцией как раз со stackoverflow вроде бы.
копируй англ версию тыды.
Нужно эту сволочь как-то заставить самому рисовать.
в более читабильную форму... и не только это.
что то типа этого (переработано-испрабленый перевод гугла)
The aim: It is necessary to render the image with the help of WPF with the video card, and then copy the result of the video card memory. There is an official version RenderTargetSource, or as it is there, but it renders with the processor - slow.
Everything what I found - a terrible hack via DirectX, which replaces the function of creating a seemingly surface on his own. In it you create your surface, you give WPF, he draws, and copy with surface. But this method has fatal flaws:
1) To make this miracle is drawn, you need to create a window. In any case. Where visible. Have to do ShowInTaskbar = false and push out beyond the screen. If this is not done, nothing will be drawn.
2) WPF renders the whole thing when he wants to, not when it is necessary. Hence, we won’t see stable smooth frame. I learned how to manage the internal time (can not remember how, but again easily by copying Framework source code to the program Reflector - where to find the hidden static class time, which can be accessed via Reflection). Yes, I manage time WPF. Exhibit, say, 1 second. But to this he had a second draw - it is he himself decides. Need this scum somehow get me to draw.
The new. NET 4 they added CachedBitmap, which caches were drawn crap in video memory to accelerate the work. Maybe you can somehow get the image using it?
In general, there is any normal way to get pictures with WPF?
Ideally, it is something similar to this:
var c = new WPFCapturer ();
Bitmap bmp = c.Capture (grid1, 640, 480);
Moreover, the method calls itself Capture grid1 drawing on a graphics card, copies the result into RAM and gives the result. If, in addition to everything else to do his crutch in the form of visible window, it will be just super.
http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/1303525-add-optional-hardware-acceleration-to-rendertarget
Тебе надо тут проголосовать, может добавят фичу в 5-й версии WPF