Как получить изображения с клиентской веб-камеры

Я хочу создать веб-сайт ASP.Net, где пользователь может захватить изображение с веб-камеры и сохранить его в базе данных на моем сервере. Я пытался использовать TWAIN, но не могу найти новых камер, которые его поддерживают. То же самое при попытке использовать Silverlight и WIA. Кто-нибудь добился успеха в этом?

На клиентском компьютере будет любая веб-камера, которую я рекомендую, поэтому, если вы знаете работающую модель, поделитесь ею. Я безуспешно пробовал и Microsoft LifeCam, и Logitech.

Если вы сделали это или сейчас, как я был бы очень признателен за помощь. Спасибо за ваше время.


person user229133    schedule 27.12.2012    source источник


Ответы (3)


Если вы ориентируетесь на более новые браузеры (те, которые поддерживают метод WebRTC getUserMedia), то Photobooth.js может подойти вам.

Цитата из WebMonkey: «Последняя новинка WebRTC, которая привлекла наше внимание, — это Photobooth.js разработчика Вольфрама Хемпеля, библиотека JavaScript для работы с камерой устройства».

http://www.webmonkey.com/2012/12/add-an-html5-webcam-to-your-site-with-photobooth-js/

И сама библиотека:

http://wolframhempel.com/2012/12/02/photobooth-js/

Надеюсь, это сработает для вас!

person OnoSendai    schedule 27.12.2012

asp.net является технологией на стороне сервера и не имеет возможности подключения к веб-камере на стороне клиента. Ваш браузер сильно изолирован и вряд ли разрешит доступ к веб-камере пользователя.

Рассмотрите возможность создания компонента Flash или Silverlight для доступа к веб-камере.

Исключением является то, что на многих мобильных платформах браузер может получить доступ к камере и хранилищу изображений через тег <input type="file" />. Это имело место некоторое время на Android и теперь является опцией Safari v6. Я не знаю ни одного браузера для настольных компьютеров, который разрешал бы прямой доступ к подключенной веб-камере.

Обходным решением для награждения может быть то, что пользователь может делать снимки, а затем получать к ним доступ через загрузку файла.

person andleer    schedule 27.12.2012

Я смог выполнить то, что хотел, попросив пользователя установить Google Chrome Frame на свой компьютер, а затем использовать тег холста для получения изображения. Хорошо работает вот пример кода:

    <div>

        <p id="status" style="color:red">
            <noscript>JavaScript is disabled.</noscript>
        </p>


        <table>
            <tr>
                <td>
                    <input id="btnTakePicture" type="button" value="Take Picture"; />
                </td>
                <td>
                    <input id="btnSave" type="button" value="Save Picture"; />
                </td>
            </tr>
        </table>


        <asp:Button ID="btnSavePicture" runat="server" Text="HiddenSave" OnClick="btnSavePicture_Click" CssClass="hiddencol"  />

        <asp:Panel ID="pnlHide" runat="server" style="display:none" >    
            <textarea id="eventdata" rows="18" cols="1" style="width: 100%" runat="server"></textarea>
        </asp:Panel>

        <script type="text/javascript">

                navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
                navigator.mozGetUserMedia || navigator.msGetUserMedia;

                var webcam = (function () {


                    var video = document.createElement('video'),
                    photo = document.createElement('canvas');

                    function play() {

                        if (navigator.getUserMedia) {

                            navigator.getUserMedia({ video: true, audio: true, toString: function () { return "video,audio"; } }, onSuccess, onError);

                        } else {

                            changeStatus('getUserMedia is not supported in this browser.', true);
                        }

                    }

                    function onSuccess(stream) {

                        var source;

                        if (window.webkitURL) {

                            source = window.webkitURL.createObjectURL(stream);

                        } else {

                            source = stream; // Opera and Firefox
                        }


                        video.autoplay = true;

                        video.src = source;

                        changeStatus('Connected.', false);

                    }

                    function onError() {

                        changeStatus('Please accept the getUserMedia permissions! Refresh to try again.', true);

                    }

                    function changeStatus(msg, error) {
                        var status = document.getElementById('status');
                        status.innerHTML = msg;
                        status.style.color = (error) ? 'red' : 'green';
                    }


                    // allow the user to take a screenshot
                    function setupPhotoBooth() {
                        //var takeButton = document.createElement('button');
                        var takeButton = document.getElementById('btnTakePicture');
                        //takeButton.innerText = 'Take Picture';
                        takeButton.addEventListener('click', takePhoto, true);
                        //document.body.appendChild(takeButton);

                        //var saveButton = document.createElement('button');
                        var saveButton = document.getElementById('btnSave');
                        //saveButton.id = 'btnSave';
                        //saveButton.innerText = 'Save Picture';
                        saveButton.disabled = true;
                        saveButton.addEventListener('click', savePhoto, true);
                        //document.body.appendChild(saveButton);

                    }

                    function takePhoto() {

                        // set our canvas to the same size as our video
                        photo.width = video.width;
                        photo.height = video.height;

                        var context = photo.getContext('2d');
                        context.drawImage(video, 0, 0, photo.width, photo.height);

                        // allow us to save
                        var saveButton = document.getElementById('btnSave');
                        saveButton.disabled = false;

                        var data = photo.toDataURL("image/png");

                        data = data.replace("image/png", "");

                        document.getElementById("<%= eventdata.ClientID %>").value = data;

                    }

                    function savePhoto() {
                        //                        var data = photo.toDataURL("image/png");

                        //                        data = data.replace("image/png", "image/octet-stream");

                        //                        document.getElementById("<%= eventdata.ClientID %>").value = data;
                        //                        document.location.href = data;

                        SendBack();
                    }

                    return {
                        init: function () {

                            changeStatus('Please accept the permissions dialog.', true);

                            video.width = 320;
                            video.height = 240;

                            document.body.appendChild(video);
                            document.body.appendChild(photo);

                            navigator.getUserMedia || (navigator.getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia);

                            play();
                            setupPhotoBooth();

                        } ()

                    }


                })();

            function SendBack() {
                var btn = document.getElementById("<%= btnSavePicture.ClientID %>");
                btn.click();
            }

    </script>

    </div>
person user229133    schedule 23.01.2013