Здравствуйте.
Столкнулся я с задачей получения фотографий с фотокамеры в моей программе на c#, причем надо было так, чтобы пользователь нажал кнопку в программе, или случилось какое-то программное событие, и мы ррррраз и получили снимок с камеры в программу и дальше его как-нибудь обработали/сохранили/отправили, в общем сделали с ним что-нибудь программным же образом.
Как оказалось, у производителей цифровых зеркальных фотокамер есть специальный SDK, через который можно программным путем к этой самой камере обратиться и поуправлять ею. У меня камера Nikon D5200, хотя для Sony и Canon вроде бы тоже видел подобный SDK.
Цель статьи рассказать о возможности и показать короткий пример. Как известно, если вы знаете что что-то можно сделать, то узнать, как это сделать – пара пустяков.
Итак, что нам понадобиться:
Во-первых, вам нужно скачать сам SDK с сайта Никона: sdk.nikonimaging.com/apply
Вам придется пройти регистрацию и стать почетным разработчиком Никона, причем при регистрации нужно использовать почтовый ящик организации, общедоступные ящики там не прокатывают. Там же можно увидеть список поддерживаемых камер, к сожалению дешевые мыльницы не поддерживаются.
Во-вторых, для простоты, рекомендую воспользоваться уже написанным NikonCSWrapper’ом: sourceforge.net/p/nikoncswrapper/wiki/Home
Далее создаете свой проект (в Visual Studio), подключаете ссылку на никоновский враппер, и, внимание: копируете в директорию с бинарниками файлы: NkdPTP.dll и Type0009.md3 (вот тут цифры могут отличаться в зависимости от камеры), которые можно отыскать в скачанном SDK.
Теперь небольшой пример о том, как фотографировать:
Сначала определяем менеджер устройств:
Затем привязываем к менеджеру обработчик события добавления устройства:
в коде обработчика у меня вот такой текст:
Здесь я сохраняю ссылку на новое устройство и привязываю обработчик к событию ImageReady, которое будет срабатывать когда камера фотографирует, причем событие вызывается, и когда вы из программы командуете сфотографировать, и когда вы на самой камере жмете кнопку.
Обработчик события фотографирования у меня выглядит так:
Здесь я просто получаю доступ к буферу, в котором сидит фотография и через MemoryStream загружаю ее в Image, который потом отправляю в pictureBox, чтобы вывести ее на форме. Как вы знаете, с Image вообще можно делать все что угодно, мой код – только для примера.
Чтобы сфоткать камерой из программного кода, нужно вызвать метод Capture():
Ну и при выходе из программы обязательно нужно закрыть менеджер устройств, иначе потом не подключитесь к нему, пока не перезагрузите компьютер:
Вообще, через SDK можно делать множество вещей с вашей камерой: получать и устанавливать любые(?) параметры камеры, фотографировать, снимать видео, фокусировать автоматически и вручную (из программы), получать живое видео с видоискателя.
На этом у меня все, надеюсь, кому-нибудь эта информация пригодиться, Спасибо за внимание.
Столкнулся я с задачей получения фотографий с фотокамеры в моей программе на c#, причем надо было так, чтобы пользователь нажал кнопку в программе, или случилось какое-то программное событие, и мы ррррраз и получили снимок с камеры в программу и дальше его как-нибудь обработали/сохранили/отправили, в общем сделали с ним что-нибудь программным же образом.
Как оказалось, у производителей цифровых зеркальных фотокамер есть специальный SDK, через который можно программным путем к этой самой камере обратиться и поуправлять ею. У меня камера Nikon D5200, хотя для Sony и Canon вроде бы тоже видел подобный SDK.
Цель статьи рассказать о возможности и показать короткий пример. Как известно, если вы знаете что что-то можно сделать, то узнать, как это сделать – пара пустяков.
Итак, что нам понадобиться:
Во-первых, вам нужно скачать сам SDK с сайта Никона: sdk.nikonimaging.com/apply
Вам придется пройти регистрацию и стать почетным разработчиком Никона, причем при регистрации нужно использовать почтовый ящик организации, общедоступные ящики там не прокатывают. Там же можно увидеть список поддерживаемых камер, к сожалению дешевые мыльницы не поддерживаются.
Во-вторых, для простоты, рекомендую воспользоваться уже написанным NikonCSWrapper’ом: sourceforge.net/p/nikoncswrapper/wiki/Home
Далее создаете свой проект (в Visual Studio), подключаете ссылку на никоновский враппер, и, внимание: копируете в директорию с бинарниками файлы: NkdPTP.dll и Type0009.md3 (вот тут цифры могут отличаться в зависимости от камеры), которые можно отыскать в скачанном SDK.
Теперь небольшой пример о том, как фотографировать:
Сначала определяем менеджер устройств:
NikonManager manager = new NikonManager("Type0009.md3");
Затем привязываем к менеджеру обработчик события добавления устройства:
manager.DeviceAdded += manager_DeviceAdded;
в коде обработчика у меня вот такой текст:
void manager_DeviceAdded(NikonManager sender, NikonDevice device)
{
_device = device;
this.Text = _device.Name;
_device.ImageReady += _device_ImageReady;
}
Здесь я сохраняю ссылку на новое устройство и привязываю обработчик к событию ImageReady, которое будет срабатывать когда камера фотографирует, причем событие вызывается, и когда вы из программы командуете сфотографировать, и когда вы на самой камере жмете кнопку.
Обработчик события фотографирования у меня выглядит так:
void _device_ImageReady(NikonDevice sender, NikonImage image)
{
MemoryStream ms = new MemoryStream(image.Buffer);
Image img = Image.FromStream(ms);
ms.Close();
pictureBox1.Image = img;
}
Здесь я просто получаю доступ к буферу, в котором сидит фотография и через MemoryStream загружаю ее в Image, который потом отправляю в pictureBox, чтобы вывести ее на форме. Как вы знаете, с Image вообще можно делать все что угодно, мой код – только для примера.
Чтобы сфоткать камерой из программного кода, нужно вызвать метод Capture():
_device.Capture();
Ну и при выходе из программы обязательно нужно закрыть менеджер устройств, иначе потом не подключитесь к нему, пока не перезагрузите компьютер:
manager.Shutdown();
Вообще, через SDK можно делать множество вещей с вашей камерой: получать и устанавливать любые(?) параметры камеры, фотографировать, снимать видео, фокусировать автоматически и вручную (из программы), получать живое видео с видоискателя.
На этом у меня все, надеюсь, кому-нибудь эта информация пригодиться, Спасибо за внимание.