Reader Level:
Article

Capture a Photo in Windows Store Apps

By Deepak Middha on Oct 17, 2012
In this article I describe how to create a Windows Store App to capture an image in a Windows Store App using JavaScript..

Introduction

In this article I describe how to create a Windows Store App to capture an image using JavaScript. In this article we capture a photo from a webcam. For this app it is necessary that you have a webcam in your system and all the drivers of the webcam are Correctly installed. If you don't have a webcam or your webcam does not work then this app will still run but it cannot capture images from the webcam.

I assume you can create a simple Windows Store App using JavaScript. For more help visit Simple Windows Store Apps using JavaScript.

To start the creation of the app, add two JavaScript pages by right-clicking on the js folder in the Solution Explorer and select Add > new item > JavaScript Page and then give an appropriate name. In the same way, add one HTML page to your project.

photo-windows-store-apps.jpg


Write the following code in default.html:

<!DOCTYPE html>

<html>

<head>

    <meta charset="utf-8" />

    <title> app</title>

    <link rel="stylesheet" href="//Microsoft.WinJS.1.0/css/ui-light.css" />

    <script src="//Microsoft.WinJS.1.0/js/base.js"></script>

    <script src="//Microsoft.WinJS.1.0/js/ui.js"></script>

    <link rel="stylesheet" href="/css/default.css" />

    <script src="/js/script1.js"></script>

    <script src="/js/default.js"></script>

</head>

<body role="application" style="background-color: lightblue">

    <center> <div id="rootGrid">       

        <div id="content">

            <h1 id="featureLabel"></h1>

            <div id="contentHost"></div>

        </div>      

    </div></center>

</body>

</html>

Write the following code in default.js:
 

(function () {

    "use strict";

    var appTitle = "Photo capture";

 

    var pages = [

 

        { url: "page.html" }

    ];

 

    function activated(eventObject) {

        if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {

            eventObject.setPromise(WinJS.UI.processAll().then(function () {

                var url = WinJS.Application.sessionState.lastUrl || pages[0].url;

                return WinJS.Navigation.navigate(url);

            }));

        }

    }

    WinJS.Navigation.addEventListener("navigated", function (eventObject) {

        var url = eventObject.detail.location;

        var host = document.getElementById("contentHost");

        host.winControl && host.winControl.unload && host.winControl.unload();

        WinJS.Utilities.empty(host);

        eventObject.detail.setPromise(WinJS.UI.Pages.render(url, host, eventObject.detail.state).then(function () {

            WinJS.Application.sessionState.lastUrl = url;

        }));

    });

    WinJS.Namespace.define("App", {

        appTitle: appTitle,

        pages: pages

    });

    WinJS.Application.addEventListener("activated", activated, false);

    WinJS.Application.start();

})(); 


Write the following code in page.html:
 

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <title></title>

    <link rel="stylesheet" href="/css/capturephoto.css" />

    <script src="/js/script.js"></script>

</head>

<body>

    <div data-win-control="App.pageInput">

 

        <button id="captureButton">Capture Photo</button>

        <button id="resetButton">Reset</button>

        <br />

        <br />

    </div>

    <div data-win-control="App.pageOutput">

        <img class="imageHolder" id="capturedPhoto" alt="image holder" src="/images/1.jpg" />

    </div>

</body>

</html>


Write the following code in script.js:
 

(function () {

    "use strict";

    var photoKey = "capturedPhoto";

    var localSettings = Windows.Storage.ApplicationData.current.localSettings;

 

    var page = WinJS.UI.Pages.define("page.html", {

        ready: function (element, options) {

            document.getElementById("captureButton").addEventListener("click", capturePhoto, false);

            document.getElementById("resetButton").addEventListener("click", reset, false);

            document.getElementById("resetButton").style.visibility = "hidden";

 

            if (localSettings.values[photoKey]) {

                document.getElementById("captureButton").disabled = true;

                reloadPhoto();

            }

        }

    });

    function capturePhoto() {

        WinJS.log && WinJS.log("", "app", "status");

        var dialog = new Windows.Media.Capture.CameraCaptureUI();

        var aspectRatio = { width: 1, height: 1 };

        dialog.photoSettings.croppedAspectRatio = aspectRatio;

        dialog.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).done(function (file) {

            if (file) {

                var photoBlobUrl = URL.createObjectURL(file, { oneTimeOnly: true });

                document.getElementById("capturedPhoto").src = photoBlobUrl;

                document.getElementById("resetButton").style.visibility = "visible";

                localSettings.values[photoKey] = file.path;

            } else {

                WinJS.log && WinJS.log("No photo captured.", "app", "status");

            }

        }, function (err) {

            WinJS.log && WinJS.log(err, "app", "error");

        });

    }

    function reset() {

        WinJS.log && WinJS.log("", "app", "status");

        document.getElementById("capturedPhoto").src = "/images/placeholder-sdk.png";

        document.getElementById("resetButton").style.visibility = "hidden";

        localSettings.values.remove(photoKey);

    }

 

    function reloadPhoto() {       

        Windows.Storage.StorageFile.getFileFromPathAsync(localSettings.values[photoKey]).done(function (file) {

            document.getElementById("capturedPhoto").src = URL.createObjectURL(file, { oneTimeOnly: true });

            document.getElementById("resetButton").style.visibility = "visible";

            document.getElementById("captureButton").disabled = false;

        }, function (err) {

            localSettings.values.remove(photoKey);

            document.getElementById("captureButton").disabled = false;

            WinJS.log && WinJS.log(err, "app", "error");

        });

    }

})(); 


Write the following code in script1.js:
 

(function () {   

       var pageOutput = WinJS.Class.define(

        function (element, options) {

            element.winControl = this;

            this.element = element;

            new WinJS.Utilities.QueryCollection(element)

                        .setAttribute("role", "region")

                        .setAttribute("aria-labelledby", "outputLabel")

                        .setAttribute("aria-live", "assertive");

            element.id = "output";

 

            this._addOutputLabel(element);

            this._addStatusOutput(element);

        }, {

            _addOutputLabel: function (element) {

                var label = document.createElement("h2");

                label.id = "outputLabel";

                label.textContent = "Output";

                element.parentNode.insertBefore(label, element);

            },

            _addStatusOutput: function (element) {

                var statusDiv = document.createElement("div");

                statusDiv.id = "statusMessage";

                element.insertBefore(statusDiv, element.childNodes[0]);

            }

        }

    );

    var currentpageUrl = null;

    WinJS.Navigation.addEventListener("navigating", function (evt) {

        currentpageUrl = evt.detail.location;

    });

    WinJS.log = function (message, tag, type) {        

            var statusDiv = document.getElementById("statusMessage");           

    };   

    function activated(e) {

        WinJS.Utilities.query("#featureLabel")[0].textContent = App.appTitle;

    }

    WinJS.Application.addEventListener("activated", activated, false);

    WinJS.Namespace.define("App", {

      pageOutput: pageOutput

    });   

})(); 


Output:

photos-windows-store-apps.jpg

Summary

In this app I described how to capture a photo in a Windows Store App using JavaScript. I hope this article has helped you to understand this topic. Please share if you know more about this. Your feedback and constructive contributions are welcome.

Deepak Middha

Deepak Middha is one time Microsoft MVP(Client App Dev) , working as Sr. Software Developer with lots of hands on experience using ASP.NET 2.0/3.5, AJAX, MVC, C#,  SQL Server 2005/2008/2012, WCF, JQuery and Silverl... Read more

COMMENT USING