Отримання знімків з цифрової дзеркальної камери (Nikon) з програмного коду на c #

    Здравствуйте.
 
Зіткнувся я з завданням отримання фотографій з фотокамери в моїй програмі на 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 можна робити безліч речей з вашою камерою: отримувати і встановлювати будь-які (?) Параметри камери, фотографувати, знімати відео, фокусувати автоматично і вручну (з програми), отримувати живе відео з видошукача.
 
На цьому у мене все, сподіваюся, комусь ця інформація нагоді, Спасибі за увагу.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.