<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-563071785757928434</id><updated>2012-01-29T17:00:04.991+01:00</updated><category term='Visual Studio'/><category term='Add-In'/><category term='Microsoft'/><category term='Silverlight 5'/><category term='Mango'/><category term='.Net German'/><category term='Computer graphics'/><category term='.Net'/><category term='FB'/><category term='HLSL'/><category term='Unity3D'/><category term='Silverlight 2'/><category term='Balder'/><category term='Shader'/><category term='Interview'/><category term='PicLab'/><category term='Augmented Reality'/><category term='Matrix3DEx'/><category term='Windows Phone'/><category term='WriteableBitmapEx'/><category term='picfx'/><category term='wp7'/><category term='Imagine Cup'/><category term='Win8'/><category term='Coding4Fun'/><category term='Live'/><category term='WriteableBitmap'/><category term='Impressum'/><category term='SL53D'/><category term='Silverlight 3'/><category term='review'/><category term='Facebook'/><category term='Mobile'/><category term='mix11'/><category term='wpdev'/><category term='Website'/><category term='Webcam'/><category term='JPEG'/><category term='Wp7Dev'/><category term='Silverlight 4'/><category term='MVP'/><category term='Blogger'/><category term='book'/><category term='Open Source'/><category term='Blogging'/><category term='WinRT'/><category term='C#'/><category term='3D'/><category term='NuGet'/><category term='Demoscene'/><category term='Physical simulation'/><category term='marketing'/><category term='SLARToolkit'/><category term='Silverlight'/><title type='text'>Kodierer [Coder]</title><subtitle type='html'>Kodiert [Coding] .Net, Silverlight and Windows Phone in C#.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5940949035893755287</id><published>2012-01-13T20:43:00.003+01:00</published><updated>2012-01-15T10:34:20.479+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='wpdev'/><title type='text'>Breakdown of Windows Phone App Download Statistics</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mlLMcRiI-0k/TxBKSKOwtQI/AAAAAAAAAWo/WG91wk20c1o/s1600/noun_project_815.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-mlLMcRiI-0k/TxBKSKOwtQI/AAAAAAAAAWo/WG91wk20c1o/s1600/noun_project_815.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i&gt;&lt;a href="http://thenounproject.com/noun/line-graph/#icon-No815"&gt;Line Graph&lt;/a&gt; by Scott Lewis, Noun&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;In this blog post I want to share the download graph of my quite successful Windows Phone app&amp;nbsp;&lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;and my conclusions.&amp;nbsp;Some of you might have seen a similar graph already on &lt;a href="https://twitter.com/#!/rschu/status/157544136831008768"&gt;Twitter&lt;/a&gt; or on &lt;a href="https://www.facebook.com/photo.php?fbid=2389884757497"&gt;Facebook&lt;/a&gt;, but I thought an update and a bit more explanation might probably make sense.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The graph below shows the download statistics of my &lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab app&lt;/a&gt;&amp;nbsp;during the last 9 months. The green line represents the daily downloads and the orange are the accumulated downloads. I blurred the numbers at the scales, since I don't release the download number for various reasons.&amp;nbsp;Please note, Pictures Lab offers a trial mode which means users can try the app for free. Therefore the download numbers&amp;nbsp;aren't&amp;nbsp;equal to the number of sold licenses! Although the app has a pretty good &lt;a href="http://en.wikipedia.org/wiki/Conversion_rate"&gt;conversion rate&lt;/a&gt; from trial-to-paid of ~32% worldwide average and in December it even was 97% in&amp;nbsp;Norway! I noticed that all the Scandinavian countries seem to have a great conversion rate in general. Worst seems to be Hong Kong, but that's a story for a different blog post. Just to be clear, Pictures Lab&amp;nbsp;provides me with a solid extra income each month and the trend is positive, but it's not enough to make a living out of that yet.&lt;br /&gt;The absolute download numbers actually don't matter that much for this blog post. The important part of the graph are the text labels I manually added. Those labels mark events I tracked and noted at that time and are&amp;nbsp;usually followed by a download peak.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-6VtUS6N37B0/TxKcs6DnpQI/AAAAAAAAAXY/-OSFHa9hdrs/s1600/PicturesLab_Downloads_9mo_labels.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="284" src="http://2.bp.blogspot.com/-6VtUS6N37B0/TxKcs6DnpQI/AAAAAAAAAXY/-OSFHa9hdrs/s640/PicturesLab_Downloads_9mo_labels.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pictures Lab download graph from 04-01-2011 to 01-07-2012 (click on the image for the original size).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;My conclusions&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Steadily releasing updates with new&amp;nbsp;functionality&amp;nbsp;and being featured at the &lt;a href="http://kodierer.blogspot.com/2011/12/windows-phone-sites-around-world.html"&gt;Windows Phone sites&lt;/a&gt; has a big impact on the downloads. Keep in mind the major Pictures Lab updates were featured at least at 3-5 of the top Windows Phone sites.&lt;/li&gt;&lt;li&gt;Being featured at the Marketplace also has a significant&amp;nbsp;positive&amp;nbsp;impact on downloads. Of course this depends on how big the local Marketplace is.&amp;nbsp;Unfortunately does&amp;nbsp;the AppHub not provide the information when an app has been featured. There is the &lt;a href="http://monitor.distimo.com/"&gt;Distimo&lt;/a&gt; service which tracks that too, but that service needs your live id&amp;nbsp;credentials&amp;nbsp;and I won't give a 3rd party site my live id to store it in their database.&amp;nbsp;Fortunately some of my friends ping me when they see my apps being featured in their local marketplace. I think it's pretty much safe to say that all the graph peaks without a label nearby are&amp;nbsp;related&amp;nbsp;to a Marketplace feature. &amp;nbsp;&lt;/li&gt;&lt;li&gt;The base line increased not only after the 3.0, but also after the peak of the 4.0 update. The 4.0 update brought the multi-language support with 10 languages. The steady download jump after 4.0 is a pretty good&amp;nbsp;indication that localization can help to increase downloads.&lt;/li&gt;&lt;li&gt;The price drop to $0.99 was followed by the highest peak in the graph, but after that it went down pretty quickly. I think the price point is the hardest thing to get right and it largely varies for different kind of apps, so the above Pictures Lab pricing information shouldn't be generalized. &amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Of course Christmas, the holidays and New Year also resulted in nice peaks. Customers have time to browse the marketplace or just want to fill up their brand new Windows Phones with some apps.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;What about the Windows Phone 7.5?&lt;/b&gt;&lt;br /&gt;The first Windows Phone 7.5 (previously known as Mango) devices and Nokia hit the market in October and November 2011. This fact also needs to be considered when interpreting the graph. Although from looking at the statistics of my other apps I see that Windows Phone 7.5 didn't have such a huge impact like the updates had. The downloads definitely increased due to the Windows Phone 7.5 launch, but the tracked events align very well with the peaks in the graph and the increase of the base line after.&lt;br /&gt;Let me try to&amp;nbsp;clarify&amp;nbsp;this and my conclusion #3 with the graphs of my successful&amp;nbsp;&lt;a href="http://windowsphone.com/s?appid=da4c75d6-df50-e011-854c-00237de2db9e"&gt;Helium Voice Free app&lt;/a&gt; and my not so successful &lt;a href="ttp://bit.ly/BenchmarkFree"&gt;Benchmark Free app&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://windowsphone.com/s?appid=da4c75d6-df50-e011-854c-00237de2db9e"&gt;Helium Voice Free&lt;/a&gt;&amp;nbsp;got a nice update in November, but I didn't inform the Windows Phone sites, so there are no peaks in the graph. You can see that the release of Windows Phone 7.5 slightly increased the downloads and the downward trend turned into an upward trend.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CXK3-SB-a64/TxKc3EY6bGI/AAAAAAAAAXg/rXV9TTDnS5k/s1600/HeliumVoiceFree_Downloads_9mo.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="278" src="http://3.bp.blogspot.com/-CXK3-SB-a64/TxKc3EY6bGI/AAAAAAAAAXg/rXV9TTDnS5k/s640/HeliumVoiceFree_Downloads_9mo.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Helium Voice&amp;nbsp;Free&amp;nbsp;graph from 04-01-2011 to 01-07-2012 (click on the image for the original size to see numbers).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the&amp;nbsp;&lt;a href="ttp://bit.ly/BenchmarkFree"&gt;Benchmark Free&lt;/a&gt;&amp;nbsp;download graph there's also&amp;nbsp;this small increase of the average downloads around the Windows Phone 7.5 device launch, but it's not as much as after the updates of Pictures Lab.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sO27bTUm8R4/TxKdEUXmVuI/AAAAAAAAAXo/g5o98BdpBcs/s1600/BenchmarkFree_Downloads_9mo.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="284" src="http://2.bp.blogspot.com/-sO27bTUm8R4/TxKdEUXmVuI/AAAAAAAAAXo/g5o98BdpBcs/s640/BenchmarkFree_Downloads_9mo.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Benchmark Free&amp;nbsp;graph from 04-01-2011 to 01-07-2012 (click on the image for the original size).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Considering all that information, I think this means the Windows Phone 7.5 launch of course raised the downloads base line, but the Pictures Lab updates had a bigger impact on the downloads and it's not only the Windows Phone 7.5 launch which raised the average downloads of Pictures Lab.&lt;br /&gt;Keep in mind that such a statistical analysis&amp;nbsp;isn't bullet-proof at all, esp. when there's not all the information available like the date of all marketplace features and more. Please also note not all apps are the same and things that work for&amp;nbsp;&lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="http://windowsphone.com/s?appid=da4c75d6-df50-e011-854c-00237de2db9e"&gt;Helium Voice Free&lt;/a&gt;&amp;nbsp;don't&amp;nbsp;necessarily&amp;nbsp;need to be valid for other apps.&lt;br /&gt;&lt;br /&gt;Makes sense?&lt;br /&gt;What are your conclusions?&lt;br /&gt;&lt;div&gt;What is your experience?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Thank you!&lt;/b&gt;&lt;/div&gt;I would like to thank all the users of the app, the great group of translators who helped me to translate&amp;nbsp;&lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab&lt;/a&gt;, the beta testers and not at last all the great Windows Phone sites which keep us informed about all the things happening around Windows Phone and help us&amp;nbsp;developers&amp;nbsp;by informing the world about our apps. Keep it up!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5940949035893755287?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5940949035893755287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2012/01/breakdown-of-windows-phone-app-download.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5940949035893755287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5940949035893755287'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2012/01/breakdown-of-windows-phone-app-download.html' title='Breakdown of Windows Phone App Download Statistics'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-mlLMcRiI-0k/TxBKSKOwtQI/AAAAAAAAAWo/WG91wk20c1o/s72-c/noun_project_815.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-83193819054056808</id><published>2012-01-05T21:30:00.000+01:00</published><updated>2012-01-05T21:36:37.709+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='wpdev'/><category scheme='http://www.blogger.com/atom/ns#' term='FB'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Let me out - Facebook Logout in a Windows Phone App</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bGiT_3GA2Yo/TwX8DmPuKKI/AAAAAAAAAWQ/a02HIWo8G7k/s1600/fb_logout.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-bGiT_3GA2Yo/TwX8DmPuKKI/AAAAAAAAAWQ/a02HIWo8G7k/s1600/fb_logout.png" /&gt;&lt;/a&gt;&lt;/div&gt;A while ago I implemented the Facebook photo endpoint into my Windows Phone &lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab app&lt;/a&gt;. The implementation of the login was quite straightforward thanks to OAuth 2.0. Only the logout was way harder than one might expect. This&amp;nbsp;post describes how to logout from Facebook using the Facebook API.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In my&amp;nbsp;&lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab app&lt;/a&gt;&amp;nbsp;you can edit photos, make them look awesome and then save or share those with your friends at Twitter or Facebook.&amp;nbsp;The Windows Phone Mango API provides the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.sharelinktask(v=vs.92).aspx"&gt;ShareLinkTask&lt;/a&gt;&amp;nbsp;and the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.sharestatustask(v=VS.92).aspx"&gt;ShareStatusTask&lt;/a&gt;&amp;nbsp;which can be used by an app to share an URL or text using the social services the user has connected the device to.&amp;nbsp;Unfortunately&amp;nbsp;there's no built-in SharePhotoTask to share a photo using the services the user has already authorized. That's why I had to implement it in a custom way where the user has to authorize again.&amp;nbsp;This&amp;nbsp;&lt;a href="http://buildmobile.com/facebook-in-a-windows-phone-7-app/"&gt;blog post&lt;/a&gt;&amp;nbsp;by my mate Nick Randolph describes very well how to login to Facebook from a Windows Phone app.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-xUZ3DAZDfPQ/TwYAiC1cyDI/AAAAAAAAAWc/Vnx0NhjNawI/s1600/logout.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-xUZ3DAZDfPQ/TwYAiC1cyDI/AAAAAAAAAWc/Vnx0NhjNawI/s320/logout.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;For some situations it might make sense to allow the user to logout from within the app. One might think this can't be hard and in most cases it's pretty easy. Logging out from Twitter is very easy for example. You just have to start the authorization process again. However, logging out from Facebook is way harder since they store a cookie and the &lt;a href="http://msdn.microsoft.com/en-us/library/ff431812(v=vs.92).aspx"&gt;WebBrowser control&lt;/a&gt; doesn't provide a way to clear the cookies, so just starting the authorization process again doesn't work.&lt;br /&gt;One way to log out from Facebook uses a special Uri that contains a part of the access token which was queried during the app&amp;nbsp;authorization&amp;nbsp;process.&lt;br /&gt;&lt;br /&gt;Here's the snippet I use in Pictures Lab to split the access token to get the session key which is then used to build the custom Uri:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public Uri GetLogoutUri(FacebookCredentials credentials)&lt;br /&gt;{&lt;br /&gt;   var sessionkey = ExtractSessionKeyFromAccessToken(credentials.AccessToken);&lt;br /&gt;   var url = String.Format("http://facebook.com/logout.php?app_key={0}&amp;amp;session_key={1}&amp;amp;next={2}", EndpointData.FacebookAppId, sessionkey, EndpointData.FacebookLogoutCallbackUrl);&lt;br /&gt;   return new Uri(url);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static string ExtractSessionKeyFromAccessToken(string accessToken)&lt;br /&gt;{&lt;br /&gt;   if (!String.IsNullOrEmpty(accessToken))&lt;br /&gt;   {&lt;br /&gt;      var parts = accessToken.Split('|');&lt;br /&gt;      if (parts.Length &amp;gt; 2)&lt;br /&gt;      { &lt;br /&gt;         return parts[1];&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   return String.Empty;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That logout Uri is then used to navigate the WebBrowser control to it which then correctly triggers the log out process.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;Browser.Navigate(FacebookService.GetLogoutUri(EndpointData.Settings.Facebook));&lt;/pre&gt;&lt;br /&gt;That's it. You just have to know their trick. Hope this helps.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-83193819054056808?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/83193819054056808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2012/01/let-me-out-facebook-logout-in-windows.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/83193819054056808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/83193819054056808'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2012/01/let-me-out-facebook-logout-in-windows.html' title='Let me out - Facebook Logout in a Windows Phone App'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-bGiT_3GA2Yo/TwX8DmPuKKI/AAAAAAAAAWQ/a02HIWo8G7k/s72-c/fb_logout.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5823164122018556559</id><published>2012-01-05T20:25:00.003+01:00</published><updated>2012-01-05T21:49:19.816+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Mango'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='HLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 5'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='SL53D'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='wpdev'/><title type='text'>SLARToolkit Samples Updated</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-z-D_jBcDds0/TdqpOa1WT6I/AAAAAAAAAQ4/IMUor83BnKQ/s1600/Marker_SLAR_16x16segments_80width_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-z-D_jBcDds0/TdqpOa1WT6I/AAAAAAAAAQ4/IMUor83BnKQ/s1600/Marker_SLAR_16x16segments_80width_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The samples of my open source Windows Phone and Silverlight Augmented Reality Toolkit were updated to the latest version of the WP 7.1 and Silverlight 5 SDKs.&lt;br /&gt;Please note the changed&amp;nbsp;security&amp;nbsp;model in Silverlight 5, which is a big bummer. My Silverlight MVP friend Morten wrote a few true words about it &lt;a href="http://sharpgis.net/post/2011/12/10/Why-Silverlight-5%E2%80%99s-3D-is-(almost)-useless.aspx"&gt;here&lt;/a&gt;. &lt;br /&gt;As usual you can find a list of the samples on the &lt;a href="http://slartoolkit.codeplex.com/"&gt;project site&lt;/a&gt; and also get the code there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5823164122018556559?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5823164122018556559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2012/01/slartoolkit-samples-updated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5823164122018556559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5823164122018556559'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2012/01/slartoolkit-samples-updated.html' title='SLARToolkit Samples Updated'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-z-D_jBcDds0/TdqpOa1WT6I/AAAAAAAAAQ4/IMUor83BnKQ/s72-c/Marker_SLAR_16x16segments_80width_192x192.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5785850367697535903</id><published>2011-12-20T20:37:00.000+01:00</published><updated>2011-12-20T21:27:48.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='wpdev'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>WriteableBitmapEx 1.0 Coming Soon, Test it Now!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZGok4PyhBQ0/TqrwNmH-DII/AAAAAAAAAVg/WJw3hVEl0h8/s1600/wbx_rotated.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ZGok4PyhBQ0/TqrwNmH-DII/AAAAAAAAAVg/WJw3hVEl0h8/s1600/wbx_rotated.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A new version of the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx open source library&lt;/a&gt;&amp;nbsp;has just been&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2011/10/writeablebitmapex-v0985-now-available.html"&gt;released&lt;/a&gt;, but that isn't the last release for this year. No,&amp;nbsp;&lt;a href="http://www.linkedin.com/profile/view?id=54694225"&gt;Andrew Burnett-Thompson&lt;/a&gt;&amp;nbsp;and I refactored the library to make it easier portable and we added full WPF support. Andrew did most of the work since he needed the current WriteableBitmapEx library for one of his WPF projects. As a result of the refactoring, WriteableBitmapEx will have maintained support for WPF starting with version 1.0.&lt;br /&gt;I'd have loved to add support for WinRT too,&amp;nbsp;but unfortunately it seems that WinRT only &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/39b3c702-caed-47e4-b7d3-b51d75cbca9b/"&gt;supports streamed reading / writing&lt;/a&gt; of the pixel buffer at the moment. I will wait until Microsoft ships the Windows 8 beta early next year and see what they have in there. Many WriteableBitmapEx algorithms need random buffer index access and I don't want to waste my time with massive memory copying now. Who knows what else comes in the beta and it might be better to use a whole different approach for immediate rendering with Windows 8 and WinRT.&lt;br /&gt;&lt;br /&gt;All samples were tested with the new version, but due to the massive refactoring more testing is needed. &lt;b&gt;Please test the beta version with your projects and report any bugs you find. You can download the&amp;nbsp;binaries &lt;a href="http://writeablebitmapex.codeplex.com/releases/view/39577"&gt;here&lt;/a&gt;. &lt;/b&gt;Note that this package only contains the WriteableBitmapEx binaries for Silverlight, Windows Phone and WPF. All the samples&amp;nbsp;can be found in the&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/SourceControl/list/changesets"&gt;source code repository&lt;/a&gt;&amp;nbsp;in the branch "WBX_1.0_BitmapContext". If all goes well this branch will become the trunk in a couple of weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5785850367697535903?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5785850367697535903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/12/writeablebitmapex-10-coming-soon-test.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5785850367697535903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5785850367697535903'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/12/writeablebitmapex-10-coming-soon-test.html' title='WriteableBitmapEx 1.0 Coming Soon, Test it Now!'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZGok4PyhBQ0/TqrwNmH-DII/AAAAAAAAAVg/WJw3hVEl0h8/s72-c/wbx_rotated.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-129977615004712044</id><published>2011-12-05T20:52:00.002+01:00</published><updated>2011-12-14T19:56:29.342+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding4Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='picfx'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='wpdev'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Windows Phone Sites Around the World</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7CkTJ6sRsSM/Tt0hAM00XII/AAAAAAAAAVw/FJZLWJVDfpQ/s1600/PicturesLab_Soften_FX_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-7CkTJ6sRsSM/Tt0hAM00XII/AAAAAAAAAVw/FJZLWJVDfpQ/s1600/PicturesLab_Soften_FX_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I recently released an update of my Windows Phone app &lt;a href="http://bit.ly/PicLab"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;which brings some nice new features like effect combination, two Christmas and a New Year frame and most importantly 7 new languages. Pictures Lab 4.0 now supports 9 languages: English, German, Japanese, Russian, Dutch, French, Italian, Spanish, Portuguese. This was made possible by a group of awesome native-speaking translators: &lt;a href="http://twitter.com/ailon"&gt;Alan Mendelevich&lt;/a&gt;, Takeshi Miyauchi, &lt;a href="http://twitter.com/qbitware"&gt;David Salazar&lt;/a&gt;, &lt;a href="http://twitter.com/localjoost"&gt;Joost van Schaik&lt;/a&gt;, &lt;a href="http://twitter.com/johanptrs"&gt;Johan Peeters&lt;/a&gt;, &lt;a href="http://twitter.com/pbarone"&gt;Paolo Barone&lt;/a&gt;, &lt;a href="http://twitter.com/simonech"&gt;Simone Chiaretta&lt;/a&gt;, &lt;a href="http://twitter.com/pedrolamas"&gt;Pedro Lamas&lt;/a&gt; and &lt;a href="http://twitter.com/quentez"&gt;Quentin Calvez&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I also asked my translators if they know any local Windows Phone news sites / blogs. Below is a list of international and regional Windows Phone news sites we collected. Note, that those are&amp;nbsp;primarily&amp;nbsp;consumer sites read by consumers and not only for developers. This list could be useful if you plan to release a localized version of your app and want to promote it a bit. Most sites have a "Tip Us" or contact form and are mostly happy about new content to write posts about.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Forge&lt;/b&gt;&lt;/span&gt;&lt;b style="color: red;"&gt;t this list!&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;Head over to &lt;a href="http://twitter.com/ailon"&gt;@ailon's&lt;/a&gt; awesome dedicated site:&amp;nbsp;&lt;a href="http://windowsphonesites.com/"&gt;http://windowsphonesites.com&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;English&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wmpoweruser.com/"&gt;http://wmpoweruser.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mobilitydigest.com/category/windowsphone/"&gt;http://mobilitydigest.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wpcentral.com/"&gt;http://www.wpcentral.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://allaboutwindowsphone.com/"&gt;http://allaboutwindowsphone.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://windowsphonegeek.com/"&gt;http://windowsphonegeek.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zomgitscj.com/"&gt;http://zomgitscj.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mykindofphone.com/"&gt;http://www.mykindofphone.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windowsphonemetro.com/"&gt;http://www.windowsphonemetro.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://windowsphoneparent.com/"&gt;http://windowsphoneparent.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.1800pocketpc.com/"&gt;http://www.1800pocketpc.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pocketnow.com/"&gt;http://pocketnow.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wp7connect.com/"&gt;http://www.wp7connect.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windowsphonedaily.com/"&gt;http://www.windowsphonedaily.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wpsauce.com/"&gt;http://www.wpsauce.com&lt;/a&gt;&amp;nbsp;(India)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ilovewindowsphone.in/"&gt;http://ilovewindowsphone.in&lt;/a&gt;&amp;nbsp;(India)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windowsphonerocks.com/"&gt;http://www.windowsphonerocks.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;German&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wp7app.de/"&gt;http://wp7app.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.worldofppc.com/"&gt;http://worldofppc.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.phoneseven.de/"&gt;http://www.phoneseven.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wp7de.com/"&gt;http://wp7de.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windows-smartphones.de/"&gt;http://www.windows-smartphones.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pocketpc.ch/"&gt;http://www.pocketpc.ch&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Russian&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.pocketpc.ch/"&gt;http://&lt;/a&gt;&lt;a href="http://www.wp7rocks.com/"&gt;WP7Rocks.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pocketpc.ch/"&gt;http://&lt;/a&gt;&lt;a href="http://wp7forum.ru/"&gt;WP7Forum.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pocketpc.ch/"&gt;http://&lt;/a&gt;&lt;a href="http://w7phone.ru/"&gt;W7Phone.ru&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pocketpc.ch/"&gt;http://&lt;/a&gt;&lt;a href="http://w7ph.ru/"&gt;W7Ph.ru&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Japanese&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nanapho.jp/"&gt;http://nanapho.jp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.shintak.info/"&gt;http://blogs.shintak.info&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/aonishi"&gt;http://blogs.msdn.com/b/aonishi&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Dutch&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wp7.nl/"&gt;http://wp7.nl&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Spanish&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wphone.es/"&gt;http://wphone.es&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.miwindowsphone.net/"&gt;http://www.miwindowsphone.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windowsphoneforos.com/"&gt;http://www.windowsphoneforos.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wp7total.info/"&gt;http://wp7total.info&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xataka.com/moviles/windows-phone-7"&gt;http://www.xataka.com/moviles/windows-phone-7&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Portuguese&amp;nbsp;(Brazilian)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://windowsphonebrasil.com.br/"&gt;http://windowsphonebrasil.com.br&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Italian&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.windowsphoneitaly.com/"&gt;http://www.windowsphoneitaly.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.plaffo.com/"&gt;http://www.plaffo.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wpmitalia.com/"&gt;http://www.wpmitalia.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.windows7blog.it/"&gt;http://www.windows7blog.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cellularemagazine.it/"&gt;http://www.cellularemagazine.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tecnophone.it/"&gt;http://www.tecnophone.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cellulariadhoc.blogosfere.it/"&gt;http://cellulariadhoc.blogosfere.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webmobile.blogosfere.it/"&gt;http://webmobile.blogosfere.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobileblog.it/"&gt;http://www.mobileblog.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mobile.hdblog.it/"&gt;http://mobile.hdblog.it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;div lang="x-none"&gt;&lt;a href="http://www.hi-techitaly.com/"&gt;http://www.hi-techitaly.com&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;French&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.monwindowsphone.com/"&gt;http://www.monwindowsphone.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Danish&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.windowsphonefan.dk/"&gt;http://www.windowsphonefan.dk&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you know more sites, please leave a comment and I'll update the list.&lt;br /&gt;&lt;br /&gt;Telerik &lt;a href="http://www.telerik.com/products/windows-phone/getting-started/promote-your-wp7-app.aspx"&gt;published a nice whitepaper&lt;/a&gt; with more resources about app promotion.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-129977615004712044?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/129977615004712044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/12/windows-phone-sites-around-world.html#comment-form' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/129977615004712044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/129977615004712044'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/12/windows-phone-sites-around-world.html' title='Windows Phone Sites Around the World'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-7CkTJ6sRsSM/Tt0hAM00XII/AAAAAAAAAVw/FJZLWJVDfpQ/s72-c/PicturesLab_Soften_FX_192x192.jpg' height='72' width='72'/><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-1094348066523577182</id><published>2011-10-28T20:36:00.004+02:00</published><updated>2011-10-28T20:47:00.499+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='wpdev'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>WriteableBitmapEx 0.9.8.5 Now Available</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZGok4PyhBQ0/TqrwNmH-DII/AAAAAAAAAVg/WJw3hVEl0h8/s1600/wbx_rotated.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ZGok4PyhBQ0/TqrwNmH-DII/AAAAAAAAAVg/WJw3hVEl0h8/s1600/wbx_rotated.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx open source library&lt;/a&gt; has come a long way since I created the CodePlex site in December 2009. A lot of features&amp;nbsp;and the support for new platforms&amp;nbsp;were added in subsequent releases. The package is&amp;nbsp;also&amp;nbsp;available via &lt;a href="http://nuget.org/"&gt;NuGet&lt;/a&gt; since this year.&lt;br /&gt;The&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/releases/view/75811"&gt;new release v0.9.8.5&lt;/a&gt; was just made public.&amp;nbsp;A few new features were added and many small,&amp;nbsp;uncritical&amp;nbsp;issues were fixed (see the list below).&amp;nbsp;The binaries can be downloaded &lt;a href="http://writeablebitmapex.codeplex.com/releases/view/75811"&gt;from here&lt;/a&gt; or via the &lt;a href="http://nuget.org/List/Packages/WriteableBitmapEx"&gt;NuGet package&lt;/a&gt;.&amp;nbsp;Please note that this package only contains the WriteableBitmapEx binaries for Silverlight and Windows Phone. All the samples&amp;nbsp;can be found in the&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/SourceControl/list/changesets"&gt;source code repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feature list version 0.9.8.5&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Added a Rotate method for arbitrary angles (RotateFree). &lt;a href="http://writeablebitmapex.codeplex.com/workitem/15214"&gt;Provided by montago.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Added &lt;a href="http://nokola.com/blog/post/2010/10/14/Anti-aliased-Lines-And-Optimizing-Code-for-Windows-Phone-7e28093First-Look.aspx"&gt;Nokola's anti-aliased line&lt;/a&gt; drawing implementation.&lt;/li&gt;&lt;li&gt;Updated the Windows Phone project to WP 7.1 Mango.&lt;/li&gt;&lt;li&gt;Added an extension code file for the Windows Phone specific extensions and added&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/07/photos-photos-photos-how-to-save-load.html"&gt;SaveToMediaLibrary extensions&lt;/a&gt; including support for saveToCameraRoll.&lt;/li&gt;&lt;li&gt;Added an Invert method, which creates an inverted version of the input bitmap. This is useful for WP7 Theme-awareness checks using Application.Current.Resources["PhoneBackgroundBrush"].&lt;/li&gt;&lt;li&gt;Added FromContent method, which provides an easy interface to load a WriteableBitmap from the content of the app.&lt;/li&gt;&lt;li&gt;Added a static overload for the Resize method which takes the pixels array as argument.&lt;/li&gt;&lt;li&gt;Optimized the DrawLine algorithm.&lt;/li&gt;&lt;li&gt;Fixed &lt;a href="http://writeablebitmapex.codeplex.com/workitem/list/basic"&gt;some issues&lt;/a&gt; with DrawRectangle, FillRectangle, DrawEllipse, FillEllipse and DrawPolyline.&lt;/li&gt;&lt;li&gt;Fixed a bug in the bilinear Resize method that appeared when the alpha value is zero.&lt;/li&gt;&lt;li&gt;Fixed other minor issues.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Community&amp;nbsp;Community Community!&lt;/b&gt;&lt;br /&gt;Thanks to the community for constantly reporting bugs, suggesting new features and contributing code. That's exactly why open source software is just awesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-1094348066523577182?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/1094348066523577182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/10/writeablebitmapex-v0985-now-available.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1094348066523577182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1094348066523577182'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/10/writeablebitmapex-v0985-now-available.html' title='WriteableBitmapEx 0.9.8.5 Now Available'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZGok4PyhBQ0/TqrwNmH-DII/AAAAAAAAAVg/WJw3hVEl0h8/s72-c/wbx_rotated.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4837998458327773869</id><published>2011-09-17T20:04:00.004+02:00</published><updated>2011-09-20T10:17:31.059+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='WinRT'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Win8'/><title type='text'>Welcome to Zombieland, the Metro Style Land of WinRT and the Undead</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zfEW-P-GCn8/TnSsNsjtvQI/AAAAAAAAAVE/V2RblfhHzJo/s1600/zombies.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-zfEW-P-GCn8/TnSsNsjtvQI/AAAAAAAAAVE/V2RblfhHzJo/s1600/zombies.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Silverlight is dead! WPF is dead! .NET is dead! Hey,&amp;nbsp;they didn't talk about&amp;nbsp;SharePoint or SQL Server at the&amp;nbsp;&lt;a href="http://www.buildwindows.com/"&gt;BUILD conference&lt;/a&gt;, those must be dead too. Welcome our new Metro-id overlords!&lt;br /&gt;We read such &lt;a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt"&gt;FUD&lt;/a&gt; everywhere these days. Actually none of these technologies are dead for the next several years! And you'll probably agree if you know the facts and not the FUD.&amp;nbsp;So here are my thoughts based only on the facts I got from watching &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011"&gt;BUILD sessions&lt;/a&gt;, reading posts that stick to the facts and not listening to people who&amp;nbsp;obviously&amp;nbsp;didn't inform themselves, but nevertheless spread FUD around.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What happened&lt;/b&gt;&lt;br /&gt;Microsoft announced the new version of Windows at the&amp;nbsp;&lt;a href="http://www.buildwindows.com/"&gt;BUILD conference&lt;/a&gt;&amp;nbsp;and the new Windows 8 runtime called WinRT, which is used to develop &lt;a href="http://en.wikipedia.org/wiki/Metro_(design_language)"&gt;Metro&lt;/a&gt; style Apps.&amp;nbsp;Metro style Apps are&amp;nbsp;primarily&amp;nbsp;focused&amp;nbsp;on consumers, designed touch first and therefore perfect for modern multi-touch devices like tablets.&lt;br /&gt;The good ol' desktop is still there and the usual Windows applications are now called Desktop Apps.&lt;br /&gt;There's a lot confusion out there at the moment and many think only Metro style Apps are the future. Actually both models can exist side-by-side and I'm sure the mainly used UI will be the classic desktop for the usual business client. Metro is for tablets, maybe later for the phone. Desktop Apps will still work better for the classic business PC scenario in an office.&lt;br /&gt;After trying Windows 8 I don't see myself using Metro style Apps a lot on my PC when I work at the desk. However, I will love to use it when I'm hanging out on my couch with a tablet. The good news is, both models are supported by Windows 8 and therefore can run on one device, &lt;a href="http://channel9.msdn.com/posts/Windows-8-Running-on-ARM"&gt;including ARM hardware&lt;/a&gt;. Awesome!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WinRT&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1tz7Z6nUsak/TnS0RJ7ZBAI/AAAAAAAAAVI/SsgmbSV_zlc/s1600/windows8-winrt_thumb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://4.bp.blogspot.com/-1tz7Z6nUsak/TnS0RJ7ZBAI/AAAAAAAAAVI/SsgmbSV_zlc/s640/windows8-winrt_thumb.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First and foremost, .NET plays a&amp;nbsp;significant&amp;nbsp;role in both development models and is not only used for Desktop Apps. I guess the FUD comes from the architectural picture above, where .NET and Silverlight are only represented by a small box in the lower right corner. Of course Microsoft wants to push the new Metro style Apps, the WinRT model and wants to get web developers into the boat, so they adjusted the graphic and&amp;nbsp;marketing&amp;nbsp;message accordingly.&lt;br /&gt;WinRT is actually a new native COM&amp;nbsp;library, plus some extra&amp;nbsp;infrastructure. Therefore an app developer has not to deal with the COM stuff directly, instead you get a thin / fast projection layer (binding) for each of the supported programming languages. This projection layer is automatically built using WinMD metadata and provides projections for JavaScript, .NET (C# / VB) or C / C++. The UI can be designed with XAML or HTML / CSS in case of JavaScript.&lt;br /&gt;The rendering is&amp;nbsp;completely&amp;nbsp;done using DirectX 11.1 (Direct2D) which results in great performance. In Windows 8 the rendering job is finally fully executed by the right processor.&amp;nbsp;This architecture makes it also possible to implement the complete UI just with DirectX, which will usually be done by games. At the moment it's not possible in the Windows 8 Developer Preview to mix a XAML app with DirectX, which doesn't make much sense since the XAML rendering is done by DirectX. Fortunately all hints that it'll be possible in a later version of Windows 8, maybe in the beta.&lt;br /&gt;&lt;br /&gt;The below picture by &lt;a href="http://dougseven.com/2011/09/15/a-bad-picture-is-worth-a-thousand-long-discussions/"&gt;Doug Seven&lt;/a&gt; is a way more accurate picture of the Windows 8 platform architecture.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-uUSc-JjjBDs/TnWkasRU74I/AAAAAAAAAVM/LEw5eIIA4Mw/s1600/win8-new-platform.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-uUSc-JjjBDs/TnWkasRU74I/AAAAAAAAAVM/LEw5eIIA4Mw/s640/win8-new-platform.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There are a few good, unbiased posts about&amp;nbsp;WinRT out there, which stick to the facts:&lt;br /&gt;&lt;a href="http://www.infoq.com/news/2011/09/WinRT-API"&gt;WinRT: An Object Orientated Replacement for Win32&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bit.ly/r0a3Mm"&gt;WinRT, the C++ Component Extensions&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tirania.org/blog/archive/2011/Sep-15.html"&gt;WinRT&amp;nbsp;demystified&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dougseven.com/2011/09/15/a-bad-picture-is-worth-a-thousand-long-discussions/"&gt;A bad picture is worth a thousand long discussions.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/br211377(v=VS.85).aspx"&gt;WinRT reference with all namespaces&lt;/a&gt;&amp;nbsp;at the unbiased MSDN, where JaveScript is just another language one can use for Metro style Apps.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WinRT and .NET&lt;/b&gt;&lt;br /&gt;From what I have seen so far, coding Metro style Apps using C# / .NET seems pretty straightforward if&amp;nbsp;you've done Silverlight, WPF or esp. Windows Phone development before. The &lt;a href="http://en.wikipedia.org/wiki/Base_Class_Library"&gt;BCL&lt;/a&gt; used by .NET WinRT is not the full Desktop version of .NET 4.5, it's a reduced set similar to the Silverlight types.&lt;br /&gt;The design of the native WinRT COM&amp;nbsp;library&amp;nbsp;was heavily influenced by .NET. You see it everywhere. Type names, Properties, Events... Even WinMD is the .NET assembly metadata format.&lt;br /&gt;WinRT types map to .NET types and copying of data structures at the boundaries is avoided by the projection layer to get the best performance.&amp;nbsp;Only two types need to be converted using built-in extension methods. The System.IO.Stream can't be mapped to the WinRT stream, so there's an extension method. A Byte[] to WinRT IBuffer conversion is the other extension method.&lt;br /&gt;You can even write your own, custom WinRT components in C# without decorating the classes with ugly COM attributes. Those components are then automatically exposed to the other languages using the generic WinMD metadata. So you can write a component in C++ or in C# and use it from a JavaScript WinRT project. Pretty cool concept if you ask me.&lt;br /&gt;Many WinRT classes look like&amp;nbsp;their&amp;nbsp;origin is .NET / Silverlight and the WinRT WriteableBitmap is also very similar to Silverlight's implementation. &lt;b&gt;So expect a WinRT version of my &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;open source WriteableBitmapEx&amp;nbsp;library&lt;/a&gt;&amp;nbsp;in a few weeks &lt;/b&gt;when I'm done with the Mango updates for all my Windows Phone apps&lt;b&gt;. &lt;/b&gt;After that I will&amp;nbsp;probably&amp;nbsp;port / rewrite some of my WP7 apps for WinRT.&lt;br /&gt;&lt;br /&gt;The lifecycle of a WinRT app should &amp;nbsp;be quite familiar for a WP7 developer, since it's&amp;nbsp;similar to the WP 7.5 Mango Fast App Switching. The lifecycle states are: Running &amp;gt; Suspended in RAM &amp;gt; Terminated. Apps get an event for suspending, not for terminate, so the state has to be saved during suspending. Of course an app should only be resurrected from the tombstone state if the app was launched, not when resumed.&amp;nbsp;Apps get 5s for suspending and need to&amp;nbsp;launch within 15s. Unfortunately we don't know the reference machine where those values are measured. Probably the low end configuration.&lt;br /&gt;By the way, the Windows Store will be the better version of the WP7 Marketplace. It will include In-App offers, time limited trials and a very nice dashboard with a lot of analytic capabilities and insights.&lt;br /&gt;In general should a WP7 developer feel most familiar with WinRT. Many concepts made it into WinRT and were improved and actually cleaned up.&lt;br /&gt;My Silverlight MVP friend Morten Nielsen started a blog post series &lt;a href="http://bit.ly/nlpVrA"&gt;about how to port Silverlight / WPF apps to WinRT&lt;/a&gt;.&lt;br /&gt;You should also read this post:&amp;nbsp;&lt;a href="http://www.lhotka.net/weblog/WinRTAndNET.aspx"&gt;WinRT and .NET&lt;/a&gt;&amp;nbsp;and watch the ton of &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011"&gt;great BUILD sessions&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I welcome the new possibilities and great performance we get in Windows 8 with the WinRT. I'm sure Windows 8 will be an awesome tablet OS.&lt;br /&gt;XAML has become a first class citizen and .NET is now installed with Windows 8. Microsoft is also&amp;nbsp;&lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-834T"&gt;working on a next version of .N&lt;/a&gt;ET. Version 4.5 of .NET will bring better performance for WPF's ItemsControl for example. Seems not very dead to me. In fact, a&amp;nbsp;Silverlight / WPF / WP7 developer's knowledge of XAML and the Silverlight runtime is more valuable than ever before with WinRT.&lt;br /&gt;Silverlight 5 is still in&amp;nbsp;development and wasn't even released. We don't know if it will be the last version or if Silverlight 6 will see the light of the day. For now I'm quite happy with all the features of Silverlight 5 and we can develop a ton of applications for our customers for the next several years.&lt;/div&gt;&lt;div&gt;One should also not forget how long it will take until Windows 8 is finally out and reached a critical mass. A lot of machines out there still run Windows XP. Windows 7 is way better and I guess the transition to Windows 8 will take even longer. Windows 8 will probably mainly pushed by non-PC multi-touch consumer devices in the near future.&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.telerikwatch.com/2011/09/how-to-pick-your-platform-silverlight.html"&gt;This flowchart&lt;/a&gt; by the Telerik guys sums it up pretty nicely.&lt;br /&gt;&lt;br /&gt;So get yourself informed and start coding away.&amp;nbsp;Don't give FUD a chance!&lt;/div&gt;&lt;div style="font-weight: bold;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4837998458327773869?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4837998458327773869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/09/welcome-to-zombieland-metro-style-land.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4837998458327773869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4837998458327773869'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/09/welcome-to-zombieland-metro-style-land.html' title='Welcome to Zombieland, the Metro Style Land of WinRT and the Undead'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zfEW-P-GCn8/TnSsNsjtvQI/AAAAAAAAAVE/V2RblfhHzJo/s72-c/zombies.jpg' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7541939511649560840</id><published>2011-06-23T22:41:00.004+02:00</published><updated>2011-06-23T22:46:56.364+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Imagine Cup'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Imagine Cup 2011 Worldwide Finals</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Tz8SaHYtfiQ/TgObx2KXqRI/AAAAAAAAARc/oB4pMzv11k0/s1600/imagine_cup_2011_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Tz8SaHYtfiQ/TgObx2KXqRI/AAAAAAAAARc/oB4pMzv11k0/s1600/imagine_cup_2011_logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;a href="http://www.imaginecup.com/"&gt;Imagine Cup&lt;/a&gt; is one of the world's premier student tech&amp;nbsp;competitions. Students compete in different categories like Software Design, Game Design, Windows Phone 7 and &lt;a href="http://www.imaginecup.com/competitions"&gt;more&lt;/a&gt;. The&amp;nbsp;competitions&amp;nbsp;begin each year with local events in over 100 countries. The best of the best will then participate in the worldwide final. &amp;nbsp;The 2011 Imagine Cup Worldwide Finals will be held from 8 - 13 July in New York City, USA.&lt;br /&gt;&lt;br /&gt;I'm very honored to take part in the &lt;a href="http://www.imaginecup.com/"&gt;Imagine Cup 2011 Worldwide Finals&lt;/a&gt;&amp;nbsp;as a judge in the Windows Phone category. The &lt;a href="http://www.imaginecup.com/worldwide-finals/2011-judges#windows_phone_7"&gt;Windows Phone judges&lt;/a&gt; consist of two&amp;nbsp;community&amp;nbsp;members and two Microsoft employees. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;People's Choice Award&lt;/b&gt;&lt;br /&gt;There's also a &lt;a href="http://www.imaginecup.com/worldwide-finals/peoples-choice-award/media-gallery"&gt;People's Choice Award&lt;/a&gt; where everyone can vote for their favorite team. &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Can you say no if Eva Longoria asks you to vote?&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/rB6GF1PyjgA" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You can find a list of all the Windows Phone finalist teams &lt;a href="http://www.imaginecup.com/worldwide-finals/2011-finalists-winners#windows"&gt;here&lt;/a&gt;. All the teams have built great&amp;nbsp;solutions&amp;nbsp;around the &lt;a href="http://www.imaginecup.com/about/Theme"&gt;theme for 2011&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;i&gt;Imagine a world where technology&amp;nbsp;helps solve the toughest problems.&lt;/i&gt;&lt;br /&gt;There's no filter for a category at the People's Choice Award website, that's why I made a list of all the Windows Phone finalists entries:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.imaginecup.com/worldwide-finals/peoples-choice-award/view-and-vote.aspx?r=6504"&gt;DREGON&lt;/a&gt; by team "Digitron-WP7" from Belgium.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.imaginecup.com/worldwide-finals/peoples-choice-award/view-and-vote.aspx?r=6450"&gt;Peekaboo&lt;/a&gt; by team "HOMERUN" from Korea.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.imaginecup.com/worldwide-finals/peoples-choice-award/view-and-vote.aspx?r=6407"&gt;Hot Potato&lt;/a&gt;&amp;nbsp;by team "Zipi Zigi" from Korea.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.imaginecup.com/worldwide-finals/peoples-choice-award/view-and-vote.aspx?r=6395"&gt;Recyclocator&lt;/a&gt;&amp;nbsp;by team "Code Instincts" from Singapore.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.imaginecup.com/worldwide-finals/peoples-choice-award/view-and-vote.aspx?r=6493"&gt;Lifelens&lt;/a&gt;&amp;nbsp;by team "The LifeLens Project" from USA.&lt;/li&gt;&lt;/ul&gt;Please cast your vote.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7541939511649560840?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7541939511649560840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/06/imagine-cup-2011-worldwide-finals.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7541939511649560840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7541939511649560840'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/06/imagine-cup-2011-worldwide-finals.html' title='Imagine Cup 2011 Worldwide Finals'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Tz8SaHYtfiQ/TgObx2KXqRI/AAAAAAAAARc/oB4pMzv11k0/s72-c/imagine_cup_2011_logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7028698346500298176</id><published>2011-06-16T21:45:00.003+02:00</published><updated>2011-06-17T10:30:07.334+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='SL53D'/><category scheme='http://www.blogger.com/atom/ns#' term='Balder'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 5'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Cubelicious - Silverlight 5 + Balder + Physics + SLARToolkit Augmented Reality = Triple Win!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-y8QY-y4_s_s/TfpcfQf2gGI/AAAAAAAAARU/8OZHL-EJ_9Y/s1600/SLAR_SL5_Balder_Demo_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-y8QY-y4_s_s/TfpcfQf2gGI/AAAAAAAAARU/8OZHL-EJ_9Y/s1600/SLAR_SL5_Balder_Demo_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Two months ago I &lt;a href="http://kodierer.blogspot.com/2011/04/silverlight-5-3d-slartoolkit-augmented.html"&gt;released a new Silverlight 5 sample&lt;/a&gt; for my open source Silverlight Augmented Reality Toolkit - &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;. It uses the new Silverlight 5 hardware&amp;nbsp;accelerated&amp;nbsp;3D API. You can read more about the new Silverlight 5 XNA 3D API&amp;nbsp;in&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2011/04/xna-for-web-silverlight-5.html"&gt;this blog post&lt;/a&gt;.&lt;br /&gt;This post here provides a new demo for SLARToolkit which uses the open source 3D engine &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt; by my friend &lt;a href="http://www.ingebrigtsen.info/"&gt;Einar Ingebrigsten&lt;/a&gt;. This demo also leverages the open source physics engine &lt;a href="http://jiglibx.codeplex.com/"&gt;JigLibX&lt;/a&gt; my buddy &lt;a href="http://www.andybeaulieu.com/"&gt;Andy Beaulieu&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.andybeaulieu.com/Home/tabid/67/EntryID/216/Default.aspx"&gt;ported over to Silverlight&lt;/a&gt;.&amp;nbsp;You can try the live sample if you have the&amp;nbsp;&lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;Silverlight 5 beta&lt;/a&gt;&amp;nbsp;installed or watch a &lt;a href="http://vimeo.com/25201841"&gt;video&lt;/a&gt; instead.&lt;br /&gt;&lt;br /&gt;I actually spent most of the time on this project a couple of weeks ago. My good Silverlight MVP friend&amp;nbsp;&lt;a href="http://www.ingebrigtsen.info/"&gt;Einar Ingebrigtsen&lt;/a&gt;&amp;nbsp;used it in his talk at&amp;nbsp;&lt;a href="http://www.gathering.org/tg11/en/"&gt;The Gathering 2011&lt;/a&gt;. Now I finally had a bit time to finish the demo, make a video and this blog post.&lt;br /&gt;&lt;br /&gt;The SLARToolkit project description from the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;CodePlex site&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;SLARToolkit is a flexible Augmented Reality library for Silverlight with the aim to make real time&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt;&amp;nbsp;applications with Silverlight as easy and fast as possible. It can be used with Silverlight's Webcam API or with any other CaptureSource or a WriteableBitmap. SLARTookit is based on the established&amp;nbsp;&lt;a class="externalLink" href="http://nyatla.jp/nyartoolkit"&gt;NyARToolkit&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Live&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A webcam and at least the &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;Silverlight 5 beta runtime&lt;/a&gt; must be installed to run the sample. It's available &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;here&lt;/a&gt;. Alternatively there is also a video of the new sample embedded below.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you want to try it yourself you need do download the&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_SLAR_16x16segments_80width.pdf"&gt;SLAR&lt;/a&gt;&amp;nbsp;and / or&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_L_16x16segments_80width.pdf"&gt;L&lt;/a&gt;&amp;nbsp;marker, print them and hold them in front of the camera. The marker(s) should be printed non-scaled at the original size (80 x 80 mm) and centered for a small white border. As an alternative it's also possible to open a marker file on a mobile device and to use the device's screen as marker. Also make sure the camera is set up properly and the scene is illuminated well without hard shadows. See the SLARToolkit&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Markers&amp;amp;referringTitle=Home"&gt;Markers&lt;/a&gt;&amp;nbsp;documentation for more details.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Samples/SLARToolKitBalderSampleSL5/SLARToolKitBalderSampleSL5TestPage.html"&gt;Open the sample in a new page.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5mgeFhbMLhY/TfpcmrXA0GI/AAAAAAAAARY/Mu3MLn9Y9Y8/s1600/screenshot.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="584" src="http://2.bp.blogspot.com/-5mgeFhbMLhY/TfpcmrXA0GI/AAAAAAAAARY/Mu3MLn9Y9Y8/s640/screenshot.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Simply press the "Start Cam" Button to start the webcam. The properties of the particle system can &amp;nbsp;be changed with Sliders. The "Flip x-axis" Checkbox can be used to flip the video (the webcam output is mirror-reversed by default).&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you click the "Start Cam" Button for the first time you need to give your permission for the capturing. This application uses the default Silverlight capture device. You can specify the video and audio devices that are used by default with the Silverlight Configuration. Just press the right mouse button over the application, click "Silverlight" in the context menu and select the "Webcam / Mic" tab to set them.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Video&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I've recorded a short video of the new sample with&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Expression_Encoder"&gt;Expression Encoder&lt;/a&gt;'s Screen Capture feature. Please keep in mind that the screen recording software eats up a lot of resources while recording and that the actual frame rate is even better. The video is also available at &lt;a href="http://www.youtube.com/watch?v=q5vnLR8C4lw"&gt;YouTube&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="448" src="http://player.vimeo.com/video/25201841?portrait=0" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Background music is &lt;a href="http://ccmixter.org/files/_ghost/3631"&gt;Lullaby&lt;/a&gt;&amp;nbsp;by _ghost&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;This demo shows how the new Silverlight 5 3D API, the &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt; engine and the&amp;nbsp;&lt;a href="http://jiglibx.codeplex.com/"&gt;JigLibX&lt;/a&gt;&amp;nbsp;physics library can be used to&amp;nbsp;augment&amp;nbsp;the reality with the help of SLARToolkit.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;/div&gt;This sample uses the webcam video stream which fills a Rectangle shape, the video stream is also&amp;nbsp;constantly&amp;nbsp;captured and fed to the SLARToolkit&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Marker%20Detectors&amp;amp;referringTitle=Documentation"&gt;BitmapMarkerDetector&lt;/a&gt;&amp;nbsp;to detect the markers. The detection result contains a transformation matrix for each found marker which is then used to apply a global transformation to the cubes and the plane.&lt;br /&gt;I implemented a particle system with a flexible directed emitter which can be controlled through various properties. The particle system is quite generic and can be used for all kinds of particles (3D objects). The particle collision&amp;nbsp;detection&amp;nbsp;and resolving is based on rigid body physics that was implemented with the help of the &lt;a href="http://jiglibx.codeplex.com/"&gt;JigLibX&lt;/a&gt;&amp;nbsp;library&amp;nbsp;my Silverlight MVP buddy&amp;nbsp;&lt;a href="http://www.andybeaulieu.com/"&gt;Andy Beaulieu&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.andybeaulieu.com/Home/tabid/67/EntryID/216/Default.aspx"&gt;ported over to Silverlight&lt;/a&gt;.&lt;br /&gt;The rendering and the model loading is done by the 3D engine&amp;nbsp;&lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt;. It's a fantastic open source engine by &lt;a href="http://www.ingebrigtsen.info/"&gt;Einar Ingebrigtsen&lt;/a&gt;. You just need to write a couple lines of XAML and you're good to go. This sample only uses a simple cube model, but Balder has built-in model loaders to load complex 3D models and Einar provides a big sample library. He also&amp;nbsp;brought the engine to a few more platforms like Windows Phone 7, OpenGL and has even a neat software rendering fallback. Read his blog post&amp;nbsp;&lt;a href="http://www.ingebrigtsen.info/post/2011/04/13/Silverlight-5-and-Balder.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;As part of this sample I needed some vector and quaternion methods which were missing in Balder. I contributed those and the generic particle system to the&amp;nbsp;&lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt;&amp;nbsp;project. Feel free to use the particle system and the other methods in your Balder projects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download it, build your app and augment your reality&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600-h/SLARToolKit_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600/SLARToolKit_logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The open source &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit library and all samples are hosted at CodePlex&lt;/a&gt;. If you have any comments, questions or  suggestions don't hesitate and write a comment, use the &lt;a href="http://slartoolkit.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt;  on the CodePlex site or contact me &lt;a href="http://flavors.me/rschu"&gt;via any other media&lt;/a&gt;.&lt;br /&gt;Have fun with the library and please keep me updated if you use it anywhere so I can put a link on the project site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7028698346500298176?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7028698346500298176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/06/cubelicious-silverlight-5-balder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7028698346500298176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7028698346500298176'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/06/cubelicious-silverlight-5-balder.html' title='Cubelicious - Silverlight 5 + Balder + Physics + SLARToolkit Augmented Reality = Triple Win!'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-y8QY-y4_s_s/TfpcfQf2gGI/AAAAAAAAARU/8OZHL-EJ_9Y/s72-c/SLAR_SL5_Balder_Demo_192x192.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-8819656724529804963</id><published>2011-05-27T01:05:00.002+02:00</published><updated>2011-05-27T08:32:22.024+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Mango'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Nodo vs Mango - Windows Phone ListBox Performance Improvements in Action</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-8XeyZ9e9Zec/Td7R3xG7DfI/AAAAAAAAARQ/xm1JKR6wBZw/s1600/NodovsMango_ListBox_Scrolling_Perf.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8XeyZ9e9Zec/Td7R3xG7DfI/AAAAAAAAARQ/xm1JKR6wBZw/s1600/NodovsMango_ListBox_Scrolling_Perf.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;There were quite a few complaints about the Windows Phone's ListBox scrolling performance in the past. The Windows Phone team obviously heard it and heavily worked on the performance and responsiveness of the whole platform and the ListBox in particular. The touch input processing was loaded off from the UI thread to a new separate thread.&amp;nbsp;Additionally&amp;nbsp;the BitmapImage doesn't load the data on the UI thread anymore. I'm sure lots of other tweaks were implemented to increase the&amp;nbsp;performance&amp;nbsp;and the responsiveness of the platform. I think the&amp;nbsp;Windows Phone&amp;nbsp;team did a very good job!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Showdown&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The video below shows a side-by-side comparison of a Nodo device with build 7392 and a prototype device with a Mango prebuild. The Nodo device on the left side is a Samsung Omnia 7, the Mango device on the right side is the ASUS prototype.&lt;/div&gt;&lt;div&gt;For&amp;nbsp;comparison&amp;nbsp;I use the official Twitter app build against 7.0 and in the second half of the video I show the effects preview list of my &lt;a href="http://bit.ly/PicturesLab"&gt;Pictures Lab&lt;/a&gt; app. This effects pivot item only uses a ListBox with a DataTemplate that contains an Image control&amp;nbsp;with a fixed size and a TextBox for each item. So there's no background image loading being performed or any other heavy computing, just a static list with a lot of redrawing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/DivNORSksYE?hd=1" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;Background music is&amp;nbsp;&lt;a href="https://8bc.org/music/SMILETRON/Taiga/"&gt;Taiga&lt;/a&gt;&amp;nbsp;by SMILETRON&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;As you can see,&amp;nbsp;it's quite a huge difference and even this Mango prebuild &amp;nbsp;runs very smooth on this&amp;nbsp;rather old ASUS&amp;nbsp;hardware. There's still some room left for more improvement, like the rasterizer, but imagine the boost on production devices with the final Mango version.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://youtu.be/AnKysErG4hA"&gt;MANGO, MANGO, MANGO!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;I don't have a deal with Microsoft or are paid to blog or tweet this. I'm just exited about all the goodies that are coming with Mango. Good times.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-8819656724529804963?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/8819656724529804963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/05/nodo-vs-mango-windows-phone-listbox.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8819656724529804963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8819656724529804963'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/05/nodo-vs-mango-windows-phone-listbox.html' title='Nodo vs Mango - Windows Phone ListBox Performance Improvements in Action'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-8XeyZ9e9Zec/Td7R3xG7DfI/AAAAAAAAARQ/xm1JKR6wBZw/s72-c/NodovsMango_ListBox_Scrolling_Perf.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6565242303013919774</id><published>2011-05-25T21:01:00.002+02:00</published><updated>2011-05-25T21:45:04.462+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Unity3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Unity 3D and Silverlight in Harmony with SLARToolkit's Augmented Reality</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kmS_uFZetfo/TdzM8A8RsPI/AAAAAAAAARM/fhtdu1EhuFk/s1600/SLARToolkit_external_StarFighter_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-kmS_uFZetfo/TdzM8A8RsPI/AAAAAAAAARM/fhtdu1EhuFk/s1600/SLARToolkit_external_StarFighter_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;If you read this blog&amp;nbsp;regularly, you might have noticed a lot of &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt; &lt;a href="http://kodierer.blogspot.com/search/label/SLARToolkit"&gt;posts&lt;/a&gt; recently. But I'm not the only one using the open source Silverlight Augmented Reality Toolkit. There's great stuff happening out there and I see quite a few projects, especially in the academic field.&amp;nbsp;You can find a full list of projects (I know of) on the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;&amp;nbsp;project site at CodePlex.&lt;br /&gt;I love when people use my open source work, adapt or learn from it. This is what open source is all about for me.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One project recently caught my attention in particular. &lt;a href="http://www.alexju.be/"&gt;Ioulian Alexeev&lt;/a&gt; made a very amazing action game using the &lt;a href="http://unity3d.com/"&gt;Unity 3D&lt;/a&gt; game engine and he combined it with SLARToolkit to control the spaceship with a marker. Ioulian studies Multimedia at the &lt;a href="http://www.arteveldehs.be/"&gt;Arteveldehogeschool&lt;/a&gt; in Belgium and the game "StarFighter" was his bachelors test.&lt;br /&gt;&lt;br /&gt;He recorded this nice video.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="450" src="http://www.youtube.com/embed/9BbfWq0EcIo" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Note how he compares the performance of the Flash Augmented Reality Tookit and&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Performance FLARManager: Not good enough for action games&lt;br /&gt;Performance SLARToolkit: Very fast and accurate marker tracking&lt;/i&gt;&lt;/blockquote&gt;Both toolkits use the same marker-based AR algorithms from the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;You can &lt;a href="http://www.alexju.be/archive/sf/"&gt;play the game here&lt;/a&gt;. If you want to try it yourself you need do download the&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_SLAR_16x16segments_80width.pdf"&gt;SLAR&lt;/a&gt;&amp;nbsp;and / or&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_L_16x16segments_80width.pdf"&gt;L&lt;/a&gt;&amp;nbsp;marker, print them and point the camera toward these. The marker(s) should be printed non-scaled at the original size (80 x 80 mm) and centered for a small white border. As an alternative it's also possible to open a marker file on a different device and to use the device's screen as marker.&lt;br /&gt;See the SLARToolkit&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Markers&amp;amp;referringTitle=Home"&gt;Markers&lt;/a&gt;&amp;nbsp;documentation for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6565242303013919774?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6565242303013919774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/05/unity-3d-and-silverlight-in-harmony.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6565242303013919774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6565242303013919774'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/05/unity-3d-and-silverlight-in-harmony.html' title='Unity 3D and Silverlight in Harmony with SLARToolkit&apos;s Augmented Reality'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-kmS_uFZetfo/TdzM8A8RsPI/AAAAAAAAARM/fhtdu1EhuFk/s72-c/SLARToolkit_external_StarFighter_192x192.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4366553423113444869</id><published>2011-05-25T20:31:00.003+02:00</published><updated>2011-05-26T21:35:39.800+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Mango'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Why is a Y in the Windows Phone Mango Camera API</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_mY_LyyqreI/Tdy-cdGqxMI/AAAAAAAAARI/A36-Rkj689c/s1600/ycbcr.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_mY_LyyqreI/Tdy-cdGqxMI/AAAAAAAAARI/A36-Rkj689c/s1600/ycbcr.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;a href="http://create.msdn.com/en-us/home/getting_started"&gt;release of the new Mango tools&lt;/a&gt;&amp;nbsp;brings&amp;nbsp;Windows Phone development on par with Silverlight 4 and will therefore add many great features to the Windows Phone platform. This means it will also contain the Webcam CaptureSource and &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(v=VS.96).aspx"&gt;VideoSink&lt;/a&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/hh202975(v=VS.92).aspx"&gt;API from Silverlight 4&lt;/a&gt;. Additionally it also introduces the new &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.filesink(v=VS.96).aspx"&gt;FileSink class&lt;/a&gt; which can be used to record the video stream as MP4 to the Isolated Storage. Most important a new&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera(v=VS.92).aspx"&gt;PhotoCamera&lt;/a&gt;&amp;nbsp;class with a lot of functionality is present in Mango.&lt;br /&gt;This class is used in the latest &lt;a href="http://kodierer.blogspot.com/2011/05/augmented-mango-slartoolkit-for-windows.html"&gt;SLARToolkit Windows Phone sample&lt;/a&gt; and in some other new projects I'm working on.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't&amp;nbsp;Reinvent&amp;nbsp;the Wheel&lt;/b&gt;&lt;br /&gt;The Silverlight 4 webcam API was explained in this &lt;a href="http://kodierer.blogspot.com/2010/06/push-and-pull-silverlight-webcam.html"&gt;detailed blog post&lt;/a&gt; almost a year ago. The techniques and concepts I described there can now also be used with Windows Phone Mango.&lt;br /&gt;The updated&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/hh202956(v=VS.92).aspx"&gt;MSDN documentation&lt;/a&gt;&amp;nbsp;has quite a few articles and samples about the new camera API.&amp;nbsp;My MVP buddy Alex Golesh also has a nice&amp;nbsp;&lt;a href="http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2011/05/24/windows-phone-mango-what-s-new-camera-part-4-of-8.aspx"&gt;write up about the new Camera API&lt;/a&gt;.&lt;br /&gt;This blog post tries to fill the gaps and provides some information especially about the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera(v=VS.92).aspx"&gt;PhotoCamera's&lt;/a&gt;&amp;nbsp;YCrCb capture methods.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;YCbCr vs ARGB&lt;/b&gt;&lt;br /&gt;In the well-known&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/RGB_color_space"&gt;RGB color space&lt;/a&gt;&amp;nbsp;the red, green and blue&amp;nbsp;information is stored in separate&amp;nbsp;components&amp;nbsp;which also contains the redundant luminance data for each channel.&amp;nbsp;In the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/YCbCr"&gt;YCbCr color space&lt;/a&gt;&amp;nbsp;(or YCrCb) the luminance information is stored in the Y component and the chroma (color) information in the Cb component as blue-difference and in Cr component as red-difference. The RGB-YCbCr conversion can be done with simple addition and multiplication operations. The Y component usually ranges from 0 to 1, Cb and Cr from -0.5 to 0.5.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_mY_LyyqreI/Tdy-cdGqxMI/AAAAAAAAARI/A36-Rkj689c/s1600/ycbcr.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_mY_LyyqreI/Tdy-cdGqxMI/AAAAAAAAARI/A36-Rkj689c/s1600/ycbcr.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Y = 0.5, Cr [-0.5, 0.5], Cb[-0.5, 0.5]&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Humans are more sensitive to luminance information than to chroma, therefore the resolution of the color information can be reduced and only the luminance needs to be stored in full resolution.&amp;nbsp;Many digital camera sensors use the YCrCb color space and make use of this reduced chroma information.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PhotoCamera&lt;/b&gt;&lt;br /&gt;The&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera(v=VS.92).aspx"&gt;PhotoCamera&lt;/a&gt;&amp;nbsp;class has a lot of useful methods to either&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.captureimage(v=VS.92).aspx"&gt;capture a full resolution image&lt;/a&gt;&amp;nbsp;from the camera or to get a smaller (and faster) preview buffer snapshot. The&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.getpreviewbuffery(v=VS.92).aspx"&gt;GetPreviewBufferY&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.getpreviewbufferycrcb(v=VS.92).aspx"&gt;GetPreviewBufferYCrCb&lt;/a&gt;&amp;nbsp;methods provide the direct data from the camera without a transformation to 32 bit ARGB. Not only is the alpha channel left out in the YCrCb buffer, also the Cr and Cb color components are stored with reduced resolution. This keeps the buffer size smaller and is way faster, but also makes it a bit trickier when the color components (and&amp;nbsp;brightness) need to be extracted from the byte buffer. Fortunately there's the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.ycrcbpixellayout(v=VS.92).aspx"&gt;YCbCrPixelLayout property&lt;/a&gt;&amp;nbsp;which contains alls the offsets, strides and other needed&amp;nbsp;information.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;The&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.getpreviewbufferycrcb(v=VS.92).aspx"&gt;GetPreviewBufferYCrCb&lt;/a&gt;&amp;nbsp;method is approximately&amp;nbsp;4 times faster than the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.getpreviewbufferargb32(v=VS.92).aspx"&gt;GetPreviewBufferArgb32&lt;/a&gt;&amp;nbsp;method&amp;nbsp;and also takes a smaller buffer, therefore the YCrCb methods are the way to go when only the&amp;nbsp;luminance&amp;nbsp;data is needed or the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/YCbCr"&gt;YCbCr color space&lt;/a&gt;&amp;nbsp;can be used for the given scenario. For example many computer vision techniques only need the luminance information for processing.&lt;br /&gt;I like that both color spaces are supported by the API. On mobile devices you need all the performance you can get.&amp;nbsp;I actually helped the Windows Phone camera team with quite a bit feedback to decide about this API design. Very smart people by the way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4366553423113444869?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4366553423113444869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/05/why-is-y-in-windows-phone-mango-camera.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4366553423113444869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4366553423113444869'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/05/why-is-y-in-windows-phone-mango-camera.html' title='Why is a Y in the Windows Phone Mango Camera API'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_mY_LyyqreI/Tdy-cdGqxMI/AAAAAAAAARI/A36-Rkj689c/s72-c/ycbcr.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-3673877053902141193</id><published>2011-05-24T22:18:00.005+02:00</published><updated>2011-05-25T21:04:22.076+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Mango'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Augmented Mango - SLARToolkit for Windows Phone</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-HWgJ5PB48FE/Tdv-KcK2lJI/AAAAAAAAARA/BtJV_6qaGo4/s1600/SLARToolkit_WP_Mango_Sample_Screenshot_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-HWgJ5PB48FE/Tdv-KcK2lJI/AAAAAAAAARA/BtJV_6qaGo4/s1600/SLARToolkit_WP_Mango_Sample_Screenshot_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The beta of the &lt;a href="http://create.msdn.com/en-us/home/getting_started"&gt;new Windows Phone Developer Tools&lt;/a&gt; was just publicly released. The update with the codename "Mango" comes with many new APIs and will finally contain an API for real-time camera access what a lot of developers have been asking for.&amp;nbsp;The new runtime gives us the needed&amp;nbsp;functionality&amp;nbsp;to implement many cool scenarios. One of these&amp;nbsp;scenarios&amp;nbsp;is &lt;a href="http://en.wikipedia.org/wiki/Augmented_reality"&gt;Augmented Reality&lt;/a&gt;, which leads to my open source Silverlight Augmented Reality Toolkit (&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;).&lt;br /&gt;This post announces the new Windows Phone version of&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;&amp;nbsp;and also provides a sample. If you're one of those lucky people with a Mango-enabled device you can download the XAP &lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Samples/SLARToolKitWinPhoneSample/SLARToolKitWinPhoneSample.xap"&gt;here&lt;/a&gt; or just watch a&amp;nbsp;video&amp;nbsp;instead.&lt;br /&gt;&lt;br /&gt;The SLARToolkit project description from the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;CodePlex site&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;SLARToolkit is a flexible marker-based Augmented Reality library for Silverlight and Windows Phone with the aim to make real time&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt;&amp;nbsp;applications with Silverlight as easy and fast as possible. It can be used with Silverlight's Webcam API or with any other CaptureSource, WriteableBitmap or with the Windows Phone's PhotoCamera. SLARTookit is based on the established&amp;nbsp;&lt;a class="externalLink" href="http://nyatla.jp/nyartoolkit"&gt;NyARToolkit&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Demo&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The &lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Samples/SLARToolKitWinPhoneSample/SLARToolKitWinPhoneSample.xap"&gt;sample XAP&lt;/a&gt; can be deployed to a Mango-enabled device (tested with build 7629). Alternatively there's also a video of the new sample embedded below.&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you want to try it yourself you need do download the&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_SLAR_16x16segments_80width.pdf"&gt;SLAR&lt;/a&gt;&amp;nbsp;and / or&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_L_16x16segments_80width.pdf"&gt;L&lt;/a&gt;&amp;nbsp;marker, print them and point the camera toward these. The marker(s) should be printed non-scaled at the original size (80 x 80 mm) and centered for a small white border. As an alternative it's also possible to open a marker file on a different device and to use the device's screen as marker.&lt;br /&gt;See the SLARToolkit&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Markers&amp;amp;referringTitle=Home"&gt;Markers&lt;/a&gt;&amp;nbsp;documentation for more details.&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wmFPyAuBmzw/TdqvFUmIBwI/AAAAAAAAAQ8/CQdk9hyKOHQ/s1600/SLAR_Text.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/-wmFPyAuBmzw/TdqvFUmIBwI/AAAAAAAAAQ8/CQdk9hyKOHQ/s640/SLAR_Text.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-4FRMOxJgCnw/Tdv-ok8DmgI/AAAAAAAAARE/rZ64jjJXRBM/s1600/SLARToolkit_WP_Mango_Sample_Image_Overlay.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/-4FRMOxJgCnw/Tdv-ok8DmgI/AAAAAAAAARE/rZ64jjJXRBM/s640/SLARToolkit_WP_Mango_Sample_Image_Overlay.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Video&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I've recorded a short video of the new sample with my Samsung Omnia 7. It's a bit blurry, but it demonstrates how well the sample works even on this quite old ASUS prototype, which's camera pipeline seems a bit slow.&lt;br /&gt;The video is also available at&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=cW7Ub69EtPU"&gt;YouTube&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;iframe frameborder="0" height="420" src="http://player.vimeo.com/video/24184014?portrait=0" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Background music is &lt;a href="http://www.mosaik.se/leandi/"&gt;Melo&lt;/a&gt;&amp;nbsp;by Mosaik&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This demo shows how the new Windows Phone Mango real-time camera API can be used &amp;nbsp;to&amp;nbsp;augment&amp;nbsp;the reality with the help of the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;. This can be nice for educational projects and it's actually no problem&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;to add&lt;/a&gt;&amp;nbsp;correctly transformed videos or other content to the demo.&lt;br /&gt;The demo demonstrates just some basic UIElements like a TextBox and an Image control. Mango will also enable the combination of Silverlight and XNA, which means that nice 3D AR games can be developed with the help of the SLARToolkit.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This sample uses the new &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera(v=VS.92).aspx"&gt;PhotoCamera&lt;/a&gt; and a timer to constantly get a snapshot of the real-time camera stream. This snapshot is then passed to the SLARToolkit algorithms to get the 3D spatial information of the marker. The computed detection results are used to transform the elements&amp;nbsp;perspectively&amp;nbsp;correct.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)&lt;br /&gt;{&lt;br /&gt;   base.OnNavigatedTo(e);&lt;br /&gt;&lt;br /&gt;   // Initialize the webcam&lt;br /&gt;   photoCamera = new PhotoCamera();&lt;br /&gt;   photoCamera.Initialized += PhotoCameraInitialized;&lt;br /&gt;   isInitialized = false;&lt;br /&gt;&lt;br /&gt;   // Fill the Viewport Rectangle with the VideoBrush&lt;br /&gt;   var vidBrush = new VideoBrush();&lt;br /&gt;   vidBrush.SetSource(photoCamera);&lt;br /&gt;   Viewport.Fill = vidBrush;&lt;br /&gt;&lt;br /&gt;   // Start timer&lt;br /&gt;   dispatcherTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(50) };&lt;br /&gt;   dispatcherTimer.Tick += (sender, e1) =&amp;gt; Detect();&lt;br /&gt;   dispatcherTimer.Start();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The PhotoCamera instance is set up in the OnNavigatedTo event handler of the page and the DispatcherTimer is started. The timer will constantly call the Detect method every 50 milliseconds. Additionally a viewfinder Rectangle is filled with a VideoBrush which in turn has the photoCamera video stream set as source.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;void Detect()&lt;br /&gt;{&lt;br /&gt;   if (!isInitialized)&lt;br /&gt;   {&lt;br /&gt;      return;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Update buffer size&lt;br /&gt;   var pixelWidth = photoCamera.PreviewBufferResolution.Width;&lt;br /&gt;   var pixelHeight = photoCamera.PreviewBufferResolution.Height;&lt;br /&gt;   if (buffer == null || buffer.Length != pixelWidth * pixelHeight)&lt;br /&gt;   {&lt;br /&gt;      buffer = new byte[pixelWidth * pixelHeight];&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Grab snapshot&lt;br /&gt;   photoCamera.GetPreviewBufferY(buffer);&lt;br /&gt;&lt;br /&gt;   // Detect&lt;br /&gt;   var dr = arDetector.DetectAllMarkers(buffer, pixelWidth, pixelHeight);&lt;br /&gt;&lt;br /&gt;   // Calculate the projection matrix&lt;br /&gt;   if (dr.HasResults)&lt;br /&gt;   {&lt;br /&gt;      // Center at origin of the 256x256 controls&lt;br /&gt;      var centerAtOrigin = Matrix3DFactory.CreateTranslation(-128, -128, 0);&lt;br /&gt;            &lt;br /&gt;      // Swap the y-axis and scale down by half&lt;br /&gt;      var scale = Matrix3DFactory.CreateScale(0.5, -0.5, 0.5);&lt;br /&gt;&lt;br /&gt;      // Calculate the complete transformation matrix based on the first detection result&lt;br /&gt;      var world = centerAtOrigin * scale * dr[0].Transformation;&lt;br /&gt;&lt;br /&gt;      // Viewport transformation&lt;br /&gt;      var viewport = Matrix3DFactory.CreateViewportTransformation(pixelWidth, pixelHeight);&lt;br /&gt;&lt;br /&gt;      // Calculate the final transformation matrix by using the camera projection matrix &lt;br /&gt;      var m = Matrix3DFactory.CreateViewportProjection(world, Matrix3D.Identity, arDetector.Projection, viewport);&lt;br /&gt;&lt;br /&gt;      // Apply the final transformation matrix to the controls&lt;br /&gt;      var matrix3DProjection = new Matrix3DProjection { ProjectionMatrix = m };&lt;br /&gt;      Txt.Projection = matrix3DProjection;&lt;br /&gt;      Img.Projection = matrix3DProjection;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A snapshot of the current preview buffer is taken in the Detect method using the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.photocamera.getpreviewbuffery(v=VS.92).aspx"&gt;GetPreviewBufferY&lt;/a&gt; method. This method fills up a byte buffer with the luminance data of the current viewfinder frame. This buffer is then passed to the SLARToolkit's MarkerDetector Detect method, which returns the detected marker information. This transformation data is then used to transform the UIElement perspectively correct in 3D.&lt;br /&gt;Read more about the PhotoCamera's YCbCr methods in &lt;a href="http://kodierer.blogspot.com/2011/05/why-is-y-in-windows-phone-mango-camera.html"&gt;this blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;void PhotoCameraInitialized(object sender, CameraOperationCompletedEventArgs e)&lt;br /&gt;{&lt;br /&gt;   //  Initialize the Detector&lt;br /&gt;   arDetector = new GrayBufferMarkerDetector();&lt;br /&gt;&lt;br /&gt;   // Load the marker pattern. It has 16x16 segments and a width of 80 millimeters&lt;br /&gt;   var marker = Marker.LoadFromResource("data/Marker_SLAR_16x16segments_80width.pat", 16, 16, 80);&lt;br /&gt;&lt;br /&gt;   // The perspective projection has the near plane at 1 and the far plane at 4000&lt;br /&gt;   arDetector.Initialize(photoCamera.PreviewBufferResolution.Width, photoCamera.PreviewBufferResolution.Height, 1, 4000, marker);&lt;br /&gt;&lt;br /&gt;   isInitialized = true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The SLARToolkit's GrayBufferMarkerDetector is created and set up in the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.devices.camera.initialized(v=VS.92).aspx"&gt;PhotoCamera's Initialized&lt;/a&gt; event handler. The brand new GrayBufferMarkerDetector uses the byte buffer with luminance data directly without the need of an ARGB 32 bit pixel conversion.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Checkout the &lt;a href="http://slartoolkit.codeplex.com/"&gt;source code at CodePlex&lt;/a&gt; if you want to see all the details of the sample which were left out for clarity.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Download it, build your app and augment your reality&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600-h/SLARToolKit_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600/SLARToolKit_logo.jpg" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The open source&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit library and all samples are hosted at CodePlex&lt;/a&gt;. If you have any comments, questions or suggestions don't hesitate and write a comment, use the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt;&amp;nbsp;on the CodePlex site or contact me&amp;nbsp;&lt;a href="http://flavors.me/rschu"&gt;via any other media&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Have fun with the library and please keep me updated if you use it anywhere so I can put a link on the project site.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-3673877053902141193?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/3673877053902141193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/05/augmented-mango-slartoolkit-for-windows.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3673877053902141193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3673877053902141193'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/05/augmented-mango-slartoolkit-for-windows.html' title='Augmented Mango - SLARToolkit for Windows Phone'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-HWgJ5PB48FE/Tdv-KcK2lJI/AAAAAAAAARA/BtJV_6qaGo4/s72-c/SLARToolkit_WP_Mango_Sample_Screenshot_192x192.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5192916327781778953</id><published>2011-04-19T00:03:00.002+02:00</published><updated>2011-04-19T00:05:37.032+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='NuGet'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>WriteableBitmapEx goes NuGet</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XZ6szsJIabU/TRyM653SPtI/AAAAAAAAAPs/FQyB6v08SoA/s1600/wbx_announcement.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-XZ6szsJIabU/TRyM653SPtI/AAAAAAAAAPs/FQyB6v08SoA/s1600/wbx_announcement.png" /&gt;&lt;/a&gt;&lt;/div&gt;The WriteableBitmapEx library is now available as a &lt;a href="http://nuget.org/List/Packages/WriteableBitmapEx"&gt;NuGet package&lt;/a&gt;. The package contains the Silverlight and the Windows Phone binaries. The sources and the PDB are also available at &lt;a href="http://symbolsource.org/"&gt;SymbolSource.org&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://nuget.codeplex.com/"&gt;NuGet&lt;/a&gt; is a neat package management system for the .Net platform which makes the life of a .Net developer much easier. If you haven't tried NuGet until now, you should definitely &lt;a href="http://nuget.org/"&gt;give it a try&lt;/a&gt;. I'm sure you won't regret it.&amp;nbsp;To install NuGet, open Visual Studio's Tools -&amp;gt; Extension Manager and search the Online Gallery for NuGet. You can then open a project, right click the References and select "Add Library Package Reference".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5192916327781778953?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5192916327781778953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/04/writeablebitmapex-goes-nuget.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5192916327781778953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5192916327781778953'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/04/writeablebitmapex-goes-nuget.html' title='WriteableBitmapEx goes NuGet'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-XZ6szsJIabU/TRyM653SPtI/AAAAAAAAAPs/FQyB6v08SoA/s72-c/wbx_announcement.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4835482710355290827</id><published>2011-04-13T21:29:00.000+02:00</published><updated>2011-04-13T21:29:48.519+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 5'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='mix11'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='SL53D'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight 5 3D + SLARToolkit Augmented Reality = Win!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CE8k4z6cJPM/TaNer3pGv8I/AAAAAAAAAQg/xVwwcHx07Ac/s1600/SLARToolkit_SL5_Sample_Sun.Earth.Moon_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-CE8k4z6cJPM/TaNer3pGv8I/AAAAAAAAAQg/xVwwcHx07Ac/s1600/SLARToolkit_SL5_Sample_Sun.Earth.Moon_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;It's almost been a year since &lt;a href="http://kodierer.blogspot.com/2010/05/slartoolkit-beginners-guide.html"&gt;I wrote a sample&lt;/a&gt; for my open source Silverlight Augmented Reality Toolkit - &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;. The release of the new Silverlight 5 hardware&amp;nbsp;accelerated&amp;nbsp;3D API was a nice occasion to finally make a new one.&lt;br /&gt;In my &lt;a href="http://kodierer.blogspot.com/2011/04/xna-for-web-silverlight-5.html"&gt;last blog post&lt;/a&gt; I wrote a summary of all the &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;Silverlight 5 beta&lt;/a&gt; features and some notes about the new low-level, XNA 3D API.&lt;br /&gt;This post provides the new demo for SLARToolkit which leverages this fast GPU-based rendering to draw some nice effects with 60 frames per second.&amp;nbsp;You can try the live sample if you have the&amp;nbsp;&lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;Silverlight 5 beta&lt;/a&gt;&amp;nbsp;installed or watch a &lt;a href="http://vimeo.com/22168601"&gt;video&lt;/a&gt; instead.&lt;br /&gt;&lt;br /&gt;The SLARToolkit project description from the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;CodePlex site&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;SLARToolkit is a flexible Augmented Reality library for Silverlight with the aim to make real time&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt;&amp;nbsp;applications with Silverlight as easy and fast as possible. It can be used with Silverlight's Webcam API or with any other CaptureSource or a WriteableBitmap. SLARTookit is based on the established&amp;nbsp;&lt;a class="externalLink" href="http://nyatla.jp/nyartoolkit"&gt;NyARToolkit&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Live&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A webcam and at least the &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;Silverlight 5 beta runtime&lt;/a&gt; must be installed to run the sample. It's available &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;here&lt;/a&gt;. Alternatively there is also a video of the new sample embedded below.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you want to try it yourself you need do download the&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_SLAR_16x16segments_80width.pdf"&gt;SLAR&lt;/a&gt;&amp;nbsp;and / or&amp;nbsp;&lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_L_16x16segments_80width.pdf"&gt;L&lt;/a&gt;&amp;nbsp;marker, print them and hold them in front of the camera. The marker(s) should be printed non-scaled at the original size (80 x 80 mm) and centered for a small white border. As an alternative it's also possible to open a marker file on a mobile device and to use the device's screen as marker. Also make sure the camera is set up properly and the scene is illuminated well without hard shadows. See the SLARToolkit&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Markers&amp;amp;referringTitle=Home"&gt;Markers&lt;/a&gt;&amp;nbsp;documentation for more details.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Samples/SLARToolKit3DSample/SLARToolKit3DSampleTestPage.html"&gt;Open the sample in a new page.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dvn9yujQANA/TaNoKdowqNI/AAAAAAAAAQo/NMiANeUNVkA/s1600/SLARToolkit_SL5_Sample_Sun.Earth.Moon.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="572" src="http://2.bp.blogspot.com/-dvn9yujQANA/TaNoKdowqNI/AAAAAAAAAQo/NMiANeUNVkA/s640/SLARToolkit_SL5_Sample_Sun.Earth.Moon.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Simply press the "Start Fun" Button to start the webcam. The size of the objects can be changed with the "Scale" Sliders. The "Flip x-axis" Checkbox could be used to flip the video (the webcam output is mirror-reversed by default). Click the "Glass" Checkbox to apply a glass effect to the sun model.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;If you click the "Start Fun" Button for the first time you need to give your permission for the capturing. This application uses the default Silverlight capture device. You can specify the video and audio devices that are used by default with the Silverlight Configuration. Just press the right mouse button over the application, click "Silverlight" in the context menu and select the "Webcam / Mic" tab to set them.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Video&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I've recorded a short video of the new sample with&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Expression_Encoder"&gt;Expression Encoder&lt;/a&gt;'s Screen Capture feature. Please keep in mind that the screen recording software eats up a lot of resources while recording and that the actual frame rate is even better. The video is also available at &lt;a href="http://www.youtube.com/watch?v=-Y7x2TTJd9o"&gt;YouTube&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="448" src="http://player.vimeo.com/video/22168601?portrait=0" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Background music is &lt;a href="https://8bc.org/music/Alpha+C/Neon+Aurora/_/action=like"&gt;Neon Aurora&lt;/a&gt; by Alpha C&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;This demo shows how the new Silverlight 5 3D API can be used &amp;nbsp;to&amp;nbsp;augment&amp;nbsp;the reality with the help of SLARToolkit. It also demonstrates how the 3D DrawingSurface can be combined with the webcam video stream and overlaid with&amp;nbsp;ordinary&amp;nbsp;TextBoxes. This can be nice for educational projects and it's actually no problem &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;to add&lt;/a&gt; correctly transformed videos or other content to the demo.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;/div&gt;This sample uses the webcam video stream which is used to fill a Rectangle shape, the video stream is also&amp;nbsp;constantly&amp;nbsp;captured and fed to the SLARToolkit&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Marker%20Detectors&amp;amp;referringTitle=Documentation"&gt;BitmapMarkerDetector&lt;/a&gt;&amp;nbsp;to detect the markers. The detection result contains a transformation matrix for each found marker which is then used to transform the 3D objects and the TextBoxes.&lt;br /&gt;A couple of vertex and pixel &lt;a href="http://en.wikipedia.org/wiki/Shader"&gt;shaders&lt;/a&gt; are used to get the desired effects. Techniques like &lt;a href="http://en.wikipedia.org/wiki/Phong_shading"&gt;Phong shading&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Bump_mapping"&gt;Bump mapping&lt;/a&gt;&amp;nbsp;and &lt;a href="http://web.cs.wpi.edu/~matt/courses/cs563/talks/texture/texture/refract.html"&gt;Refraction mapping&lt;/a&gt; (glass) were implemented. The snapshots from the webcam are passed as a texture to the refraction pixel shader to simulate the glass effect.&lt;br /&gt;See the source code if you're&amp;nbsp;interested&amp;nbsp;in the nitty-gritty details. Please note that I wrote an introduction to Pixel Shaders for &lt;a href="http://channel9.msdn.com/coding4fun/articles/SilverShader--Introduction-to-Silverlight-and-WPF-Pixel-Shaders"&gt;Coding4Fun&lt;/a&gt;&amp;nbsp;a while ago.&lt;br /&gt;The current Silverlight 5 beta doesn't implement RenderTargets, therefore effects like&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Bloom_(shader_effect)"&gt;bloom&lt;/a&gt; aren't really possible with the limitations of the Shader Model 2. You can add a faded &lt;a href="http://en.wikipedia.org/wiki/Sprite_(computer_graphics)"&gt;billboard&lt;/a&gt; around the sun, but it wouldn't look that nice and when RenderTargets are added we can do way more nice effects in future releases of Silverlight 5.&lt;br /&gt;I also added a new simple anti-jittering&amp;nbsp;functionality&amp;nbsp;to SLARToolkit to prevent the jiggling that mostly&amp;nbsp;occurred&amp;nbsp;due to the varying lightning conditions and noise in the video stream.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Credits&lt;/b&gt;&lt;br /&gt;The SolarWind sample by the Silverlight team was used as a base and extended. The sample uses earth textures from the NASA.&amp;nbsp;The pixel shader for the sun uses textures and concepts from &lt;a href="http://www.mathematik.uni-marburg.de/~menzel/index.php?seite=tutorials&amp;amp;id=1"&gt;an article&lt;/a&gt; by Nicolas Menzel. The moon textures are from the &lt;a href="http://www.celestiamotherlode.net/catalog/moon.php"&gt;Celestia&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download it, build your app and augment your reality&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600-h/SLARToolKit_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600/SLARToolKit_logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The open source &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit library and all samples are hosted at CodePlex&lt;/a&gt;. If you have any comments, questions or  suggestions don't hesitate and write a comment, use the &lt;a href="http://slartoolkit.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt;  on the CodePlex site or contact me &lt;a href="http://flavors.me/rschu"&gt;via any other media&lt;/a&gt;.&lt;br /&gt;Have fun with the library and please keep me updated if you use it anywhere so I can put a link on the project site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4835482710355290827?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4835482710355290827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/04/silverlight-5-3d-slartoolkit-augmented.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4835482710355290827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4835482710355290827'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/04/silverlight-5-3d-slartoolkit-augmented.html' title='Silverlight 5 3D + SLARToolkit Augmented Reality = Win!'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-CE8k4z6cJPM/TaNer3pGv8I/AAAAAAAAAQg/xVwwcHx07Ac/s72-c/SLARToolkit_SL5_Sample_Sun.Earth.Moon_192x192.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4952993845304242505</id><published>2011-04-13T19:49:00.004+02:00</published><updated>2011-04-13T21:40:43.229+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='mix11'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='SL53D'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 5'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>XNA for the Web - Silverlight 5</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fzNyqxGfguo/TaNEFqXGlCI/AAAAAAAAAQY/6DEaKXErCFk/s1600/Earth_Moon_192x192.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-fzNyqxGfguo/TaNEFqXGlCI/AAAAAAAAAQY/6DEaKXErCFk/s1600/Earth_Moon_192x192.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Many great new things were announced during the second keynote at Microsoft's &lt;a href="http://live.visitmix.com/"&gt;MIX11 conference&lt;/a&gt;. One of it was the Silverlight 5 beta which is available for download &lt;a href="http://www.silverlight.net/getstarted/silverlight-5-beta/"&gt;here&lt;/a&gt;.&lt;br /&gt;The new features are just awesome and many of them were &lt;a href="http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions"&gt;requested by the community&lt;/a&gt;. As usual Tim Heuer's &lt;a href="http://timheuer.com/blog/archive/2011/04/13/whats-new-in-silverlight-5-a-guide.aspx"&gt;great blog post&lt;/a&gt; covers all the new goodies in detail and provides videos and source code for most of them.&amp;nbsp;Kudos to the Silverlight team for releasing another great version.&lt;br /&gt;My blog post contains a summary of all the new features the Silverlight 5 beta ships and provides some notes about the new 3D API. The &lt;a href="http://kodierer.blogspot.com/2011/04/silverlight-5-3d-slartoolkit-augmented.html"&gt;next blog post&lt;/a&gt; will bring a new &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;&amp;nbsp;3D demo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Features&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XNA 3D Graphics API&lt;/li&gt;&lt;li&gt;Improved Graphics stack – The graphics stack has been re-architected to bring over improvements from WP7, such as Independent Animations.&lt;/li&gt;&lt;li&gt;Hardware video decode for H.264 playback.&lt;/li&gt;&lt;li&gt;Multi-core background JIT support for improved startup performance.&lt;/li&gt;&lt;li&gt;Realtime Sound (low-latency Audio)&lt;/li&gt;&lt;li&gt;Variable Speed Playback (“Trick Play”)&lt;/li&gt;&lt;li&gt;XAML Binding Debugging&lt;/li&gt;&lt;li&gt;Multiple Window Support&lt;/li&gt;&lt;li&gt;Ancestor RelativeSource Binding&lt;/li&gt;&lt;li&gt;Implicit DataTemplates&lt;/li&gt;&lt;li&gt;ClickCount&lt;/li&gt;&lt;li&gt;Binding on Style Setter&lt;/li&gt;&lt;li&gt;Linked Text Containers&lt;/li&gt;&lt;li&gt;Custom Markup Extensions&lt;/li&gt;&lt;li&gt;ComboBox type ahead with text searching.&lt;/li&gt;&lt;li&gt;Full keyboard support in full-screen for trusted in-browser applications, enables richer kiosk and media viewing applications in-browser.&lt;/li&gt;&lt;li&gt;Default filename in SaveFileDialog – Specify a default filename when you launch the SaveFileDialog.&lt;/li&gt;&lt;li&gt;Unrestricted filesystem access – trusted applications can Read write to files in any directory on the filesystem.&lt;/li&gt;&lt;li&gt;More performance optimizations:&lt;/li&gt;&lt;li&gt;XAML Parser performance optimizations.&lt;/li&gt;&lt;li&gt;Network Latency optimizations.&lt;/li&gt;&lt;li&gt;Text layout performance improvements.&lt;/li&gt;&lt;li&gt;Hardware acceleration is enabled in windowless mode with Internet Explorer 9.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Find &lt;a href="http://www.microsoft.com/silverlight/future/"&gt;more details&lt;/a&gt; at the Silverlight site and read &lt;a href="http://johnpapa.net/"&gt;John Papa's&lt;/a&gt; and &lt;a href="http://10rem.net/blog/2011/04/13/announcing-the-silverlight-5-beta-release-and-the-silverlightnet-redesign"&gt;Pete Brown's&lt;/a&gt; blog posts.&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;XNA for the Web&lt;/b&gt;&lt;br /&gt;One of the &lt;a href="http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions/suggestions/310787-3d-support?ref=title"&gt;topmost requested features&lt;/a&gt;&amp;nbsp;at the Silverlight Uservoice site was hardware accelerated 3D graphics.&amp;nbsp;The Silverlight team listened closely and added an&amp;nbsp;immediate&amp;nbsp;mode,&amp;nbsp;low-level, &amp;nbsp;XNA 3D API to Silverlight 5. An&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Immediate_mode"&gt;immediate mode&lt;/a&gt; API offers&amp;nbsp;functionality&amp;nbsp;to render graphics directly to the graphics interface without keeping a list of the objects. A &lt;a href="http://en.wikipedia.org/wiki/Retained_mode"&gt;retained mode&lt;/a&gt; API like WPF 3D on the other hand keeps an internal list of the object graph. An&amp;nbsp;immediate mode API is a great choice since it provides the maximum control over the rendering and mostly results in superior performance compared to retained mode rendering.&lt;br /&gt;The Silverlight 5 3D API&amp;nbsp;doesn't contain all the&amp;nbsp;higher-level&amp;nbsp;classes one might know from the &lt;a href="http://msdn.microsoft.com/en-us/library/bb200104.aspx"&gt;XNA Game Studio&lt;/a&gt;. The Content Pipeline, the SpriteBatch class and others were left out. I assume this decision was made to keep the footprint of the Silverlight runtime small. However, the team added all the needed core functionality; features like the SpriteBatch can be build on top of it by the community. My Silverlight MVP&amp;nbsp;friend&amp;nbsp;&lt;a href="http://blogs.silverarcade.com/silverlight-games-101/"&gt;Bill Reiss&lt;/a&gt;&amp;nbsp;is already working on a &lt;a href="http://blogs.silverarcade.com/silverlight-games-101/13/silverlight-silverlight-5-takes-2d-silverlight-game-development-to-the-next-level/"&gt;SpriteBatch version for Silverlight 5&lt;/a&gt;.&lt;br /&gt;The new GPU&amp;nbsp;accelerated&amp;nbsp;3D API gives us Silverlight developers the core XNA functionality with&amp;nbsp;shaders and&amp;nbsp;vertex rendering inside the browser! Shaders aren't easy for most non-graphics programmers, but they give us a huge flexibility and we can build various higher levels on top of the new 3D API.&lt;br /&gt;You can render some pretty impressive things with the new Silverlight 5 3D API and it's possible to draw millions of triangles on the GPU without almost no CPU load.&lt;br /&gt;&lt;br /&gt;Here's a sneak peek at the &lt;a href="http://kodierer.blogspot.com/2011/04/silverlight-5-3d-slartoolkit-augmented.html"&gt;new SLARToolkit demo&lt;/a&gt; which also contains a simple real-time glass effect.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hbsci2s1x0c/TaNI0aStg5I/AAAAAAAAAQc/bmsJ2JtoEpY/s1600/SLARToolkit_SL5_Sample_Glass.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"&gt;&lt;img border="0" height="496" src="http://4.bp.blogspot.com/-hbsci2s1x0c/TaNI0aStg5I/AAAAAAAAAQc/bmsJ2JtoEpY/s640/SLARToolkit_SL5_Sample_Glass.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Silverlight Integration&lt;/b&gt;&lt;br /&gt;The 3D API contains a control called the DrawingSurface, which is basically a rendering surface or a 3D Canvas if you will. The DrawingSurface has the Draw event which is raised for every frame to draw. The event is fired on a render thread which runs in parallel to the UI thread. This is an important concept&amp;nbsp;introduced&amp;nbsp;with Silverlight 5.&lt;br /&gt;Inside a Draw event handler the states and shaders are set and the&amp;nbsp;vertex and index buffers&amp;nbsp;are passed to the GPU for rendering. The vertex and pixel &lt;a href="http://en.wikipedia.org/wiki/Shader"&gt;shaders&lt;/a&gt;&amp;nbsp;implement the lightning model and define how the vertices are rendered. The current Silverlight 5 3D beta only supports Shader Model 2, but this will probably change in a future release, but even with Shader Model 2 many neat lightning models and effects can be implemented. You will find some nice effects in the&amp;nbsp;new&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2011/04/silverlight-5-3d-slartoolkit-augmented.html"&gt;SLARToolkit&amp;nbsp;demo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Check out the Silverlight 5 3D samples if you want to learn more about the new 3D API. If you're not familiar with 3D graphics concepts or just want to make your life easier, then I strongly recommend to give the 3D engine &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt; a try. It's a fantastic open source engine by my good Silverlight MVP friend &lt;a href="http://www.ingebrigtsen.info/"&gt;Einar Ingebrigtsen&lt;/a&gt;. You just need to write a couple lines of XAML and you're good to go. Balder has built-in model loaders to load complex 3D models and Einar provides a big sample library. He also&amp;nbsp;brought the engine to a few more platforms like Windows Phone 7, OpenGL and has even a neat software rendering fallback. Read his blog post &lt;a href="http://www.ingebrigtsen.info/post/2011/04/13/Silverlight-5-and-Balder.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;Another Silverlight MVP friend of mine, Andy Beaulieu made a very cool demo using Balder and a 3D physics engine. He &lt;a href="http://www.andybeaulieu.com/Home/tabid/67/EntryID/216/Default.aspx"&gt;blogged about it&lt;/a&gt; and even released the 3D physics engine as &lt;a href="http://3dphysics.codeplex.com/"&gt;open source&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;div style="display: inline !important; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The beta of the 3D API is&amp;nbsp;missing some essential things like RenderTargets at the moment, but it's just a beta and more stuff might be announced at the&amp;nbsp;&lt;a href="http://live.visitmix.com/"&gt;MIX11 conference&lt;/a&gt;.&amp;nbsp;If you would like to know more details about the new Silverlight 5 3D API and the roadmap, then you should definitely check out the&amp;nbsp;&lt;a href="http://live.visitmix.com/"&gt;MIX11&lt;/a&gt;&amp;nbsp;session&amp;nbsp;&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/MED06"&gt;Graphics &amp;amp; 3D with Silverlight 5&lt;/a&gt;&amp;nbsp;by the Silverlight program manager Aaron Oneal&amp;nbsp;on Wednesday, April 13 3:30 pm - 4:30 pm PDT. All MIX sessions are recorded and&amp;nbsp;will be &lt;a href="http://live.visitmix.com/"&gt;available online&lt;/a&gt; 24 hours after each session.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;No, Silverlight is not dead and it's clear that Microsoft is investing in it. I'm sure the new features and esp. the XNA 3D API will lead to some great applications in the future.&amp;nbsp;The future is bright and we are part of it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4952993845304242505?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4952993845304242505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/04/xna-for-web-silverlight-5.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4952993845304242505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4952993845304242505'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/04/xna-for-web-silverlight-5.html' title='XNA for the Web - Silverlight 5'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-fzNyqxGfguo/TaNEFqXGlCI/AAAAAAAAAQY/6DEaKXErCFk/s72-c/Earth_Moon_192x192.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-3464272159726059072</id><published>2011-02-15T21:32:00.001+01:00</published><updated>2011-02-15T21:33:39.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Long Time No See - WriteableBitmapEx 0.9.7.0</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kGQh1bS1qlk/Sx1KnIEhZ3I/AAAAAAAAAI0/z3P5rYjXuk8/s1600/wbx_announcement.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-kGQh1bS1qlk/Sx1KnIEhZ3I/AAAAAAAAAI0/z3P5rYjXuk8/s1600/wbx_announcement.png" /&gt;&lt;/a&gt;&lt;/div&gt;I actually wanted to release the feature complete version&amp;nbsp;1.0&amp;nbsp;of the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx library&lt;/a&gt; after the &lt;a href="http://kodierer.blogspot.com/2010/06/filled-to-bursting-point.html"&gt;previous release&lt;/a&gt;, but I've been &lt;a href="http://kodierer.blogspot.com/2010/12/goodbye-2010-hello-2011.html"&gt;very busy&lt;/a&gt; with other projects during the last year. That's why I decided to release version 0.9.7.0 today. It contains many fixes, but also adds some features (see below). This version finally provides an official Windows Phone binary build, although the Windows Phone project was already &lt;a href="http://kodierer.blogspot.com/2010/03/let-it-ring-writeablebitmapex-for.html"&gt;available shortly after the first CTP&lt;/a&gt; was released. The zipped binaries can be downloaded from &lt;a href="http://writeablebitmapex.codeplex.com/releases/view/60217"&gt;here&lt;/a&gt;. Please note that this package only contains the WriteableBitmapEx binaries for Silverlight and Windows Phone. All the samples&amp;nbsp;can be found in the&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/SourceControl/list/changesets"&gt;source code repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WPF&lt;/b&gt;&lt;br /&gt;There's now also an unmaintained WPF branch of the WriteableBitmapEx library in the &lt;a href="http://writeablebitmapex.codeplex.com/SourceControl/list/changesets"&gt;source code repository&lt;/a&gt;. It was contributed by &lt;a href="http://geekswithblogs.net/kobush/Default.aspx"&gt;Szymon Kobalczyk&lt;/a&gt;.&lt;br /&gt;One might ask why it's not&amp;nbsp;maintained.&amp;nbsp;I started a &lt;a href="http://twtpoll.com/r/jcjiy1"&gt;poll &lt;/a&gt;and it seems that only 7 out of 16 need a WPF version of WriteableBitmapEx. The code is also quite bloated due to&amp;nbsp;conditional&amp;nbsp;compilation flags, which makes it harder to maintain in the future. That's why I decided not to integrate the WPF version. I just don't have enough time to maintain a hardly used version.&amp;nbsp;I would rather point WPF users to &lt;a href="http://jeremiahmorrill.com/"&gt;Jeremiah Morrill's&lt;/a&gt; new project called &lt;a href="http://directcanvas.codeplex.com/"&gt;DirectCanvas&lt;/a&gt;. It's in an early stage, but he's a great guy and working hard on it. I'm sure we'll see a great, GPU accelerated 2D drawing library for WPF in the future.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feature list version 0.9.7.0&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fixed many bugs.&lt;/li&gt;&lt;li&gt;Added the Rotate method which rotates the bitmap in 90° steps clockwise and returns a new rotated WriteableBitmap.&lt;/li&gt;&lt;li&gt;Added a Flip method with support for FlipMode.Vertical and FlipMode.Horizontal.&lt;/li&gt;&lt;li&gt;Added a new Filter extension file with a convolution method and some kernel templates (Gaussian, Sharpen).&lt;/li&gt;&lt;li&gt;Added the GetBrightness method, which returns the brightness / luminance of the pixel at the x, y coordinate as byte.&lt;/li&gt;&lt;li&gt;Added the ColorKeying BlendMode.&lt;/li&gt;&lt;li&gt;Added boundary checks to the Crop() function to avoid OutOfRangeExceptions if the passed parameters are outside the boundaries of the original bitmap.&lt;/li&gt;&lt;li&gt;Optimized the DrawLine algorithm.&lt;/li&gt;&lt;li&gt;Optimized the Resize algorithms (NearestNeighbor is now 10x faster).&lt;/li&gt;&lt;li&gt;Optimized the Clear(Color) method.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Community&amp;nbsp;FTW!&lt;/b&gt;&lt;br /&gt;Thanks to the community for constantly reporting bugs and suggesting new features. You rock! That's why I love open source software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-3464272159726059072?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/3464272159726059072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/02/long-time-no-see-writeablebitmapex-0970.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3464272159726059072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3464272159726059072'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/02/long-time-no-see-writeablebitmapex-0970.html' title='Long Time No See - WriteableBitmapEx 0.9.7.0'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-kGQh1bS1qlk/Sx1KnIEhZ3I/AAAAAAAAAI0/z3P5rYjXuk8/s72-c/wbx_announcement.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7893045917222554411</id><published>2011-01-24T20:24:00.001+01:00</published><updated>2011-01-24T20:26:13.293+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net German'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Kostenloser Windows Phone Artikel in der DotNetPro</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TT3Ra22T_gI/AAAAAAAAAQQ/_E3aW9qHd2g/s1600/dnp_022011.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TT3Ra22T_gI/AAAAAAAAAQQ/_E3aW9qHd2g/s1600/dnp_022011.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;I've written a Windows Phone development article for Germany's largest .Net developer magazine. It's written in German.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Für die&amp;nbsp;&lt;a href="http://www.dotnetpro.de/articles/articlearchive1757.aspx"&gt;aktuelle DotNetPro&lt;/a&gt;&amp;nbsp;habe ich einen Artikel zu der Entwicklung für Windows Phone 7 geschrieben. Anhand eines praktischen Beispiels werden die einzelnen APIs und Tricks gezeigt um eine Windows Phone App für die einfache Bildmanipulation zu entwickeln.&lt;br /&gt;Als Werbung für das aktuelle Magazin wird der Artikel auch kostenlos &lt;a href="http://www.dotnetpro.de/articles/freearticles/pdf/2011-02-WP.pdf"&gt;online zur Verfügung gestellt&lt;/a&gt;. In der Druckausgabe&amp;nbsp;findet man&amp;nbsp;neben&amp;nbsp;meinem Artikel auch andere Windows Phone Artikel. Wer noch tiefer in die Windows Phone Entwicklung einsteigen möchte, dem sei auch das Buch von Patrick Getzmann, Simon Hackfort, und Peter Nowak empfohlen: &lt;a href="http://blogs.compactframework.de/Peter.Nowak/2010/12/16/Erstes+Deutsches+WP7+Entwicklerbuch+Erschienen.aspx"&gt;Entwickeln für Windows Phone 7: Architektur, Frameworks, APIs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TT3REWmVoMI/AAAAAAAAAQM/H3u6xV8W72k/s1600/PicturesLab_Lomo_FX_2011-01-24_20-03-41.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TT3REWmVoMI/AAAAAAAAAQM/H3u6xV8W72k/s640/PicturesLab_Lomo_FX_2011-01-24_20-03-41.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7893045917222554411?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7893045917222554411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/01/kostenloser-windows-phone-artikel-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7893045917222554411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7893045917222554411'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/01/kostenloser-windows-phone-artikel-in.html' title='Kostenloser Windows Phone Artikel in der DotNetPro'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TT3Ra22T_gI/AAAAAAAAAQQ/_E3aW9qHd2g/s72-c/dnp_022011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5302923471771432376</id><published>2011-01-17T23:10:00.002+01:00</published><updated>2011-01-17T23:14:23.247+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Stay in Touch - How to Contact Your Marketplace Customers</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS2TUJiJ_I/AAAAAAAAAP0/OFZEiSWr_Ms/s1600/letter_seal.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS2TUJiJ_I/AAAAAAAAAP0/OFZEiSWr_Ms/s1600/letter_seal.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: 10px; line-height: 20px;"&gt;&lt;a href="http://www.flickr.com/photos/larimdame/65917688/" style="color: #5588aa; text-decoration: none;"&gt;Photo&lt;/a&gt;&amp;nbsp;(&lt;a href="http://creativecommons.org/licenses/by/2.0/deed.en" style="color: #5588aa; text-decoration: none;"&gt;CC&lt;/a&gt;) by &amp;nbsp;&lt;a href="http://www.flickr.com/photos/larimdame/" style="color: #5588aa; text-decoration: none;"&gt;LarimdaME&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;A while ago I &lt;a href="http://kodierer.blogspot.com/2010/12/listen-to-your-phone-getting-user.html"&gt;provided some methods and code snippets&lt;/a&gt;&amp;nbsp;on how to get feedback from users. Today I show a manual procedure how you can contact some of the customers that reviewed your Windows Phone app. Some might already know this, but not all developers are aware of this Marketplace / Zune functionality, so I though it might be worth sharing.&lt;br /&gt;&lt;br /&gt;Most customers are nice people that provide valuable feedback also through the Marketplace review mechanism. Others give you bad reviews and it seems like they might have misunderstood the&amp;nbsp;functionality. And some people just love to rant. Just like in real life.&amp;nbsp;If I feel the urge to contact some of the reviewers, I send a message through the Zune social network and ask for details. Unfortunately, not all review authors are registered there and only ~50% of the people can be found by their username.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step by Step&lt;/b&gt;&lt;br /&gt;1. Go to &lt;a href="http://wp7reviews.tomverhoeff.com/"&gt;http://wp7reviews.tomverhoeff.com&lt;/a&gt; and enter the Product Id of your app.&lt;br /&gt;This neat little Silverlight app will list all reviews from around the world. I recommend you bookmark the URL with the Product Id.&lt;br /&gt;2. Sort the grid by date, go through the list and copy the username of the reviewer you want to contact.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TTS7KAD_tLI/AAAAAAAAAP4/bCewJhfk5-A/s1600/reviews.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TTS7KAD_tLI/AAAAAAAAAP4/bCewJhfk5-A/s400/reviews.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;3. Open the Zune software, go to the Marketplace tab, paste the username into the search field and hit the search button.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS7iFrWr8I/AAAAAAAAAP8/aNU5nirkv-g/s1600/zune.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS7iFrWr8I/AAAAAAAAAP8/aNU5nirkv-g/s640/zune.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4. If the user was found, click on the user's profile.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TTS7rXq-KKI/AAAAAAAAAQA/oJF9RlIlQGQ/s1600/zune_search_result.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TTS7rXq-KKI/AAAAAAAAAQA/oJF9RlIlQGQ/s640/zune_search_result.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;5. Open the user's profile and send the user a message through Zune ("Send message").&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS-TBGfcbI/AAAAAAAAAQI/87z0TvGIxu4/s1600/zune_sendmessage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS-TBGfcbI/AAAAAAAAAQI/87z0TvGIxu4/s640/zune_sendmessage.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;That's it. Not the best solution and you will only reach ~50% of the users, but better than nothing. I would prefer if app developers could comment the reviews.&lt;br /&gt;Please stay professional and don't offend the review authors even if they have written nonsense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5302923471771432376?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5302923471771432376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2011/01/stay-in-touch-how-to-contact-your.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5302923471771432376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5302923471771432376'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2011/01/stay-in-touch-how-to-contact-your.html' title='Stay in Touch - How to Contact Your Marketplace Customers'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/TTS2TUJiJ_I/AAAAAAAAAP0/OFZEiSWr_Ms/s72-c/letter_seal.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-8040791079741239327</id><published>2010-12-30T20:51:00.006+01:00</published><updated>2011-01-17T16:42:03.418+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><title type='text'>Goodbye 2010 - Hello 2011</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TRueXNH9LKI/AAAAAAAAAPQ/iEPCkIFxesU/s1600/PicturesLab_HappyNewYear_FX_2010-12-29_21-35-15.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TRueXNH9LKI/AAAAAAAAAPQ/iEPCkIFxesU/s1600/PicturesLab_HappyNewYear_FX_2010-12-29_21-35-15.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;This was an amazing year! Many great things happened and a lot of stuff was released by me.&amp;nbsp;The most important release this year was a personal one. Our third daughter was born in September. Healthy and just plain awesome. She is developing very good and as amazing as her older sisters (photo).&lt;br /&gt;This blog post is just a recap of all the things that happened and I've done in 2010 and some that might happen in 2011.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Community&lt;/b&gt;&lt;br /&gt;The whole Silverlight and Windows Phone community is great and it's endless fun to be a part of it. I met a lot of great people online and offline. It's a pleasure to discuss and develop good things in this environment. Thanks a ton!&lt;br /&gt;And don't forget, &lt;a href="http://kodierer.blogspot.com/2010/11/silverlight-is-not-dead-and-not-undead.html"&gt;Silverlight is not dead&lt;/a&gt;! Silverlight 5 will be released in 2011 and it will come with a huge bag of new features.&lt;br /&gt;Stay in the 'Light! - like my Silverlight MVP friend&amp;nbsp;&lt;a href="http://geekswithblogs.net/WynApseTechnicalMusings"&gt;Dave Campbell&lt;/a&gt;&amp;nbsp;would say.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MVP Award&lt;/b&gt;&lt;br /&gt;In April 2010 &lt;a href="http://kodierer.blogspot.com/2010/04/microsoft-silverlight-mvp-award.html"&gt;I was awarded as Silverlight MVP&lt;/a&gt;. It is a real honor to be a Silverlight MVP. All the Silverlight MVPs I know are truly outstanding and I can hardly believe I'm considered to be one of them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Blogging&lt;/b&gt;&lt;br /&gt;Yep, I did some blogging this year. Most of it covered Silverlight development and lately also Windows Phone topics. I always try to provide unique content that hasn't been covered anywhere else. I hope you like it and find it useful. Your feedback is always welcome!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open Source Projects&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TRyMt4YeA2I/AAAAAAAAAPk/ZEkPB3fm9fw/s1600/SLARToolkit_Sample_Teapot_DynamicWebcam_EnvMapped.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TRyMt4YeA2I/AAAAAAAAAPk/ZEkPB3fm9fw/s1600/SLARToolkit_Sample_Teapot_DynamicWebcam_EnvMapped.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The one big think this year was the &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;release of the Silverlight Augmented Reality Framework: SLARToolkit&lt;/a&gt;.&amp;nbsp;SLARToolkit is a flexible Augmented Reality library for Silverlight with the aim to make real time&amp;nbsp;&lt;a class="externalLink" href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt;&amp;nbsp;applications with Silverlight as easy and fast as possible. It can be used with Silverlight's Webcam API or with any other CaptureSource or a WriteableBitmap. It's open source and hosted at&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;CodePlex&lt;/a&gt;.&lt;br /&gt;The development of the library itself took a lot of time, but also the samples (&lt;a href="http://www.youtube.com/watch?v=9tYn_w0xaZU"&gt;1&lt;/a&gt;, &lt;a href="http://vimeo.com/9713000"&gt;2&lt;/a&gt;), the &lt;a href="http://slartoolkit.codeplex.com/documentation"&gt;documentation&lt;/a&gt;, the support at the &lt;a href="http://slartoolkit.codeplex.com/discussions"&gt;forum&lt;/a&gt; and via email.&amp;nbsp;It's good to see that some projects use SLARToolkit and the downloads aren't that bad. I'm especially pleased to see that most of the projects are from the academic field. Some projects are listed&amp;nbsp;on the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/"&gt;CodePlex&lt;/a&gt;&amp;nbsp;site.&lt;br /&gt;I have a lot of things on my idea / todo list I want to add. I hope I'll find a bit time during the next year to implement these.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TRyMzms4IyI/AAAAAAAAAPo/aANP8tBmjh0/s1600/screenshot.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TRyMzms4IyI/AAAAAAAAAPo/aANP8tBmjh0/s1600/screenshot.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;One part of the SLARToolkit library was extracted and &lt;a href="http://kodierer.blogspot.com/2010/01/matrix3dex-10-when-planeprojection-is.html"&gt;released as separate project&lt;/a&gt;. The Matrix3DEx library is a collection of extension and factory methods for Silverlight's&amp;nbsp;&lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.matrix3d%28VS.95%29.aspx"&gt;Matrix3D struct&lt;/a&gt;. The Matrix3DEx library tries to compensate the&amp;nbsp;minimalistic&amp;nbsp;Matrix3D struct with extension and factory methods for common transformation matrices that are easy to use like built in methods. The &lt;a href="http://matrix3dex.codeplex.com/"&gt;CodePlex site&lt;/a&gt; has all the details and samples.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TRyM653SPtI/AAAAAAAAAPs/4vg5h40xme0/s1600/wbx_announcement.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TRyM653SPtI/AAAAAAAAAPs/4vg5h40xme0/s1600/wbx_announcement.png" /&gt;&lt;/a&gt;&lt;/div&gt;The&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx library&lt;/a&gt;&amp;nbsp;is another&amp;nbsp;open source project. I actually released it in 2009, but I added a lot of new features during this year and the library got quite well adopted in the community. One reason might be the&amp;nbsp;availability&amp;nbsp;of a Windows Phone version.&lt;br /&gt;The WriteableBitmapEx library is a collection of extension methods for Silverlight's &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt;. The WriteableBitmap class that was added in Silverlight 3 and which is also available on Windows Phone, allows the direct manipulation of a bitmap and could be used to generate fast procedural images by drawing directly to a bitmap. The WriteableBitmapEx library tries to compensate the minimalistic WriteableBitmap class with extensions methods that are easy to use like built in methods and offer &lt;a href="http://msdn.microsoft.com/en-us/library/ms533797(v=VS.85).aspx"&gt;GDI+&lt;/a&gt; like functionality.&lt;br /&gt;There are many different samples available at the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;CodePlex repository&lt;/a&gt;&amp;nbsp;and I also spent a good amount of time with&amp;nbsp;the support at the&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/discussions"&gt;forum&lt;/a&gt;&amp;nbsp;and via email.&lt;br /&gt;The library is still not feature complete for version 1.0 and I will definitely continue my work on it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Windows Phone Apps&lt;/b&gt;&lt;br /&gt;Like many other Silverlight developers I got very exited when Silverlight was announced as the development &amp;nbsp;platform for Windows Phone 7 apps. I started some experiments right away when the first CTP was available at MIX 2010. I also provided the WriteableBitmapEx Windows Phone version a couple of days later.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TRyIO_viXhI/AAAAAAAAAPU/j6nsYP6dDLU/s1600/Background_blue_99x99_%2528device_icon_small%2529.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TRyIO_viXhI/AAAAAAAAAPU/j6nsYP6dDLU/s1600/Background_blue_99x99_%2528device_icon_small%2529.png" /&gt;&lt;/a&gt;&lt;/div&gt;Every Windows Phone 7 device is required to have at least a 5 megapixel camera with a flashlight. There are also other features which make Windows Phones amazing devices for taking pictures and dealing with pictures. I've been working heavily during the last months to enhance this photo experience with my kind of skills. My &lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt; app was the first picture effects application for Windows Phone with unique, high quality effects. If you like to take photos then this app is a perfect addition to your phone’s toolset. Or like msnbc.com wrote: "The app, a Swiss Army knife of photo tweaks". It's the original and the best selling photo app already since the Windows Phone launch. Pictures Lab comes with more than 20 controllable and easy-to-use advanced effects, a dynamic effect preview, crop, rotate and many more features. I just recently added a Twitter sharing function and the Happy New Year effect / frame (see photo above). &lt;br /&gt;The app got very &lt;a href="http://bit.ly/PicturesLabReviews"&gt;good reviews&lt;/a&gt; from various webites, blogs and offline magazines. The well-known site&amp;nbsp;Engadget lists it under &lt;a href="http://www.engadget.com/2010/12/31/just-got-a-windows-phone-7-handset-the-best-apps-accessories/"&gt;The best apps, accessories, and tips&lt;/a&gt;.&amp;nbsp;They write:&amp;nbsp;"... a must-have for WP7 devices ... the program provides a set of amazing effects and tweaks for your photos ...".&lt;br /&gt;I will constantly update the app and add more features and effects in 2011.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TRyI4zP1z_I/AAAAAAAAAPY/yRhCu6IF9ng/s1600/ApplicationIcon_99x99.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TRyI4zP1z_I/AAAAAAAAAPY/yRhCu6IF9ng/s1600/ApplicationIcon_99x99.png" /&gt;&lt;/a&gt;&lt;/div&gt;I also developed a little fun app called &lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=4233f68e-98e7-df11-9264-00237de2db9e"&gt;Helium Voice&lt;/a&gt;. You can record your voice with the app and change the pitch while sliding over a balloon graphic (inhale or exhale helium).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have a very long list with future app ideas and it's&amp;nbsp;constantly&amp;nbsp;growing.&amp;nbsp;On some days&amp;nbsp;I have the feeling my head explodes with new ideas.&lt;br /&gt;I hope to find some time next year to push some more apps out. Silverlight is&amp;nbsp;fortunately&amp;nbsp;one of the most productive platforms out there.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;br /&gt;I also wrote some articles for Microsoft's &lt;a href="http://blogs.msdn.com/b/coding4fun"&gt;Coding4Fun site&lt;/a&gt; and a magazine.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TRyLi_idHGI/AAAAAAAAAPc/p1F_r90d_t4/s1600/clip_image003_c131258f-f36f-4ef2-ba9b-4e13d6f215b1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="157" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TRyLi_idHGI/AAAAAAAAAPc/p1F_r90d_t4/s200/clip_image003_c131258f-f36f-4ef2-ba9b-4e13d6f215b1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;It started with the&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/coding4fun/archive/2010/03/24/9984015.aspx"&gt;FaceLight article&lt;/a&gt; about a simple facial recognition system using Silverlight 4’s webcam. The code for this article ended up on &lt;a href="http://facelight.codeplex.com/"&gt;CodePlex&lt;/a&gt;, where you can also find a live sample.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRyLzVP8FBI/AAAAAAAAAPg/BV0cYXG4V3Q/s1600/5444.clip_image002_thumb_5DF85FFD.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRyLzVP8FBI/AAAAAAAAAPg/BV0cYXG4V3Q/s200/5444.clip_image002_thumb_5DF85FFD.jpg" width="190" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;a href="http://blogs.msdn.com/b/coding4fun/archive/2010/05/25/10014965.aspx"&gt;second article&lt;/a&gt; explained how to write pixel shaders for the Microsoft Silverlight and WPF platform with HLSL, as well as how to write an extensible Silverlight application with the help of &lt;a href="http://en.wikipedia.org/wiki/Managed_Extensibility_Framework"&gt;MEF&lt;/a&gt;.&lt;br /&gt;The code is also available at &lt;a href="http://silvershader.codeplex.com/"&gt;CodePlex&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRyNYCINz2I/AAAAAAAAAPw/zOg-AYKnPXU/s1600/image_thumb_5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRyNYCINz2I/AAAAAAAAAPw/zOg-AYKnPXU/s200/image_thumb_5.png" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;My last two articles for Coding4Fun showed how to write a simple photo effects application for Windows Phone (&lt;a href="http://blogs.msdn.com/b/coding4fun/archive/2010/08/09/10048007.aspx"&gt;1&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/coding4fun/archive/2010/10/19/10077086.aspx"&gt;2&lt;/a&gt;). This is&amp;nbsp;actually&amp;nbsp;where Pictures Lab has its origin.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I just recently wrote an article for&amp;nbsp;Germany's&amp;nbsp;largest .Net developer magazine, &lt;a href="http://www.dotnetpro.de/"&gt;dotnetpro&lt;/a&gt;. The article&amp;nbsp;covers Windows Phone development and is available in the February 2011 issue and also &lt;a href="http://www.dotnetpro.de/articles/freearticles/pdf/2011-02-WP.pdf"&gt;online&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I also reviewed the media / computer graphics chapters of the two best Silverlight books available. The one is &lt;a href="http://www.amazon.com/Silverlight-4-Unleashed-Laurent-Bugnion/dp/0672333368/ref=sr_1_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1274861832&amp;amp;sr=8-3-spell"&gt;Silverlight 4 Unleashed&lt;/a&gt; by &lt;a href="http://galasoft.ch/"&gt;Laurent Bugnion&lt;/a&gt; and the other is &lt;a href="http://manning.com/pbrown/"&gt;Silverlight 4 in Action&lt;/a&gt; by &lt;a href="http://10rem.net/"&gt;Pete Brown&lt;/a&gt;. Both are great books and every Silverlight developer should get a copy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Talks and the Rest&lt;/b&gt;&lt;br /&gt;I gave a talk at the &lt;a href="http://www.dd-dotnet.de/"&gt;.Net Usergroup Dresden&lt;/a&gt; about Silverlight 4's media capabilities and presented SLARToolkit. In May I had the pleasure &lt;a href="http://kodierer.blogspot.com/2010/06/interview-on-net-rocks.html"&gt;to be interviewed&lt;/a&gt; by Carl and Richard from the .Net Rocks talk show. And I worked on some very interesting projects I can't write something about yet. I also spent a good amount of time answering Silverlight questions I got via email, at the&amp;nbsp;official&amp;nbsp;&lt;a href="http://forums.silverlight.net/"&gt;forum&lt;/a&gt; or at &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It was a really busy year and I hope I can keep this high&amp;nbsp;productivity&amp;nbsp;up.&lt;br /&gt;&lt;br /&gt;By the way, I'm also a frequent social network user and met great new people there (&lt;a href="http://twitter.com/rschu"&gt;Twitter&lt;/a&gt;, &lt;a href="http://facebook.com/rene.schulte"&gt;Facebook&lt;/a&gt;).&amp;nbsp;It's a pleasure to exchange&amp;nbsp;thoughts&amp;nbsp;and share knowledge with smart people. Thanks for being awesome!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;I wish you and your families a happy and&amp;nbsp;successful&amp;nbsp;new year. 2011 will be good!&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-8040791079741239327?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/8040791079741239327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/12/goodbye-2010-hello-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8040791079741239327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8040791079741239327'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/12/goodbye-2010-hello-2011.html' title='Goodbye 2010 - Hello 2011'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/TRueXNH9LKI/AAAAAAAAAPQ/iEPCkIFxesU/s72-c/PicturesLab_HappyNewYear_FX_2010-12-29_21-35-15.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-3240310793206209346</id><published>2010-12-29T20:25:00.001+01:00</published><updated>2011-01-04T09:04:48.297+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Sending Windows Phone Screenshots in an Email</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRsyniN1oII/AAAAAAAAAO8/zvOj7OHnv4k/s1600/oldschool_screenshot.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRsyniN1oII/AAAAAAAAAO8/zvOj7OHnv4k/s1600/oldschool_screenshot.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;My Silverlight MVP friend&amp;nbsp;&lt;a href="http://galasoft.ch/"&gt;Laurent Bugnion&lt;/a&gt; blogged about &lt;a href="http://blog.galasoft.ch/archive/2010/12/28/taking-a-screenshot-from-within-a-silverlight-wp7-application.aspx"&gt;how to take a screenshot from within a Silverlight Windows Phone application&lt;/a&gt;. As he wrote this could be helpful for customer feedback and other purposes. To accomplish this, the&amp;nbsp;Silverlight &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(v=VS.95).aspx"&gt;UIElement&lt;/a&gt; is rendered to a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap(v=VS.95).aspx"&gt;WriteableBitmap&lt;/a&gt;, which can&amp;nbsp;then be saved to the device's Media Library (Pictures Hub). Afterwards it could be send in an email from the Pictures Hub or the email client.&lt;br /&gt;Wouldn't it be even nicer if the user could send an email with the screenshot directly from the app? I show you how.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Email Task&lt;/b&gt;&lt;br /&gt;The only way to send an email from a Windows Phone app is through the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.emailcomposetask(v=vs.92).aspx"&gt;EmailComposeTask&lt;/a&gt;. This task provides properties for the Subject, Body, CC, Addressee (To) and launches the email client. &lt;a href="http://kodierer.blogspot.com/2010/12/listen-to-your-phone-getting-user.html"&gt;In the last blog post I showed how I use it&lt;/a&gt; to send customer feedback with system information from my apps.&lt;br /&gt;Unfortunately the EmailComposeTask doesn't provide a way to pass an&amp;nbsp;attachment and therefore it's not possible to attach the screenshot to the email.&amp;nbsp;Fortunately&amp;nbsp;there's a way to send binary data as text inside an email. This is where &lt;a href="http://en.wikipedia.org/wiki/Base64"&gt;Base64&lt;/a&gt; encoding comes into play.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Embedding the Screenshot&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Base64"&gt;Base64&lt;/a&gt;&amp;nbsp;encoding transforms binary data into ASCII text and thereby makes it possible to send binary data as plain old text. This way we can convert the JPEG screenshot to Base64 text and set it as the Body of the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.emailcomposetask(v=vs.92).aspx"&gt;EmailComposeTask&lt;/a&gt;. The Body text length is limited and I experimented a bit with different sizes to find the limitation. It seems like the Body text is limited to less than 32k Unicode characters. A JPEG encoded screenshot of a whole Windows Phone page is too large for this (480 x 800 pixels). That's why the screenshot is rendered downscaled if the element is too large and a lower&amp;nbsp;compression&amp;nbsp;quality is used for the JPEG encoding.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private static void SendEmailScreenshot(FrameworkElement element)&lt;br /&gt;{&lt;br /&gt;   // Render the element at the maximum possible size&lt;br /&gt;   ScaleTransform transform = null;&lt;br /&gt;   if (element.ActualWidth * element.ActualHeight &amp;gt; 240 * 400)&lt;br /&gt;   {&lt;br /&gt;      // Calculate a uniform scale with the minimum possible size&lt;br /&gt;      var scaleX = 240.0 / element.ActualWidth;&lt;br /&gt;      var scaleY = 400.0 / element.ActualHeight;&lt;br /&gt;      var scale = scaleX &amp;lt; scaleY ? scaleX : scaleY;&lt;br /&gt;      transform = new ScaleTransform { ScaleX = scale, ScaleY = scale };&lt;br /&gt;   }&lt;br /&gt;   var wb = new WriteableBitmap(element, transform);&lt;br /&gt;&lt;br /&gt;   using (var memoryStream = new MemoryStream())&lt;br /&gt;   {&lt;br /&gt;      // Encode the screenshot as JPEG with a quality of 60%&lt;br /&gt;      wb.SaveJpeg(memoryStream, wb.PixelWidth, wb.PixelHeight, 0, 60);&lt;br /&gt;      memoryStream.Seek(0, SeekOrigin.Begin);&lt;br /&gt;&lt;br /&gt;      // Convert binary data to Base64 string&lt;br /&gt;      var bytes = memoryStream.ToArray();&lt;br /&gt;      var base64String = Convert.ToBase64String(bytes);&lt;br /&gt;&lt;br /&gt;      // Invoke email task&lt;br /&gt;      var emailComposeTask = new EmailComposeTask&lt;br /&gt;                              {&lt;br /&gt;                                 Subject = "Screenshot from my app",&lt;br /&gt;                                 Body = base64String,&lt;br /&gt;                                 To = "foo@bar.com",&lt;br /&gt;                              };&lt;br /&gt;      emailComposeTask.Show();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The element is downscaled uniformly if it's larger than a certain size. This is done with a ScaleTransform directly when the Silverlight (vector) element is rendered to a WriteableBitmap. Afterwards the bitmap is encoded as JPEG at a quality of 60%. This low&amp;nbsp;compression&amp;nbsp;quality reduces the size of the JPEG image significantly, but the image is still usable. The binary data is then transformed to Base64 text with the &lt;a href="http://msdn.microsoft.com/en-us/library/dhx0d524(v=VS.95).aspx"&gt;Convert.ToBase64String&lt;/a&gt; method. Finally the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.emailcomposetask(v=vs.92).aspx"&gt;EmailComposeTask&lt;/a&gt;&amp;nbsp;is created, the properties are set and the email client is opened.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Decoding the Screenshot &lt;/b&gt;&lt;br /&gt;The email will contain the Base64 encoded image. Base64 encoded data typically looks like this:&lt;br /&gt;&lt;pre class="brush: text;"&gt;/9j/4AAQSkZJRgABAQEBBgEGAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pLSwzOko&lt;br /&gt;+MzZGNywtQFdBRkxOUlNSMj5aYVpQYEpRUk//2wBDAQ4ODhMREyYVFSZPNS01T09PT09PT09PT09PT09PT09PT09PT&lt;br /&gt;09PT09PT09PT09PT09PT09PT09PT09PT09PT0//wAARCAFsAPADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAA&lt;br /&gt;AAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM&lt;br /&gt;2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJW&lt;br /&gt;Wl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAw&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The opposite&amp;nbsp;operation&amp;nbsp;of the ToBase64String method is the &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.frombase64string(v=VS.95).aspx"&gt;Convert.FromBase64String&lt;/a&gt; method. So it's easy to write a little tool that extracts the email content, converts it back to JPEG data and saves it as a file for example. Probably it's sufficient to use an online Base64 encoder like &lt;a href="http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/Default.aspx"&gt;this one&lt;/a&gt;&amp;nbsp;where the Base64 string can be pasted and the tool will create a binary file which can be downloaded.&lt;br /&gt;&lt;br /&gt;The result might look like the below screenshot from the&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;app. As you can see, the half downscaled version with the 60% quality is usable and even the small text can be read without problems.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRtQlvwRbmI/AAAAAAAAAPA/NQSSik2j1as/s1600/PicturesLab_Screenshot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRtQlvwRbmI/AAAAAAAAAPA/NQSSik2j1as/s1600/PicturesLab_Screenshot.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Future&lt;/b&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;There's also room for improvement left. More modern image compression algorithms like they are used in the&amp;nbsp;&lt;a href="http://www.hipixpro.com/"&gt;Hipix&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/WebP"&gt;WebP&lt;/a&gt;&amp;nbsp;formats&amp;nbsp;can produce better results at lower size. Another way to reduce the size could be a post process step where every odd pixel or line is removed. This technique was described in the&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2009/10/read-between-pixels-hlsl-kill-pixel.html"&gt;Kill Pixel Shader blog post&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Needless to say that the&amp;nbsp;demonstrated, well-known Base64 encoding can be used to send any small binary data inside an email from a Windows Phone app. So it's also possible to send short audio clips, binary serialized data or other data.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;For more complex tracking and feedback mechanisms an image upload webservice might be the better way. However there are many scenarios with&amp;nbsp;simple tasks where a webservice isn't feasible&amp;nbsp;and the shown technique can be helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-3240310793206209346?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/3240310793206209346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/12/sending-windows-phone-screenshots-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3240310793206209346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3240310793206209346'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/12/sending-windows-phone-screenshots-in.html' title='Sending Windows Phone Screenshots in an Email'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/TRsyniN1oII/AAAAAAAAAO8/zvOj7OHnv4k/s72-c/oldschool_screenshot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6835086724640732698</id><published>2010-12-20T23:33:00.003+01:00</published><updated>2010-12-21T15:09:11.947+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Listen to your Phone - Getting User Feedback with System Information</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TLeISc7tbZI/AAAAAAAAAM8/IaQglsEADpk/s1600/VideoLogo_192x192.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TLeISc7tbZI/AAAAAAAAAM8/IaQglsEADpk/s1600/VideoLogo_192x192.png" /&gt;&lt;/a&gt;&lt;/div&gt;Two weeks ago I've &lt;a href="http://kodierer.blogspot.com/2010/12/windows-phone-unplugged-how-to-detect.html"&gt;blogged about a trick&lt;/a&gt;&amp;nbsp;my Windows Phone&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;app&amp;nbsp;uses to detect if the Zune software is running. Today I have a handful of classes that help to gather system&amp;nbsp;information and provide an easy interface for the email task. No magic at all, but I though it might be helpful for others too.&lt;br /&gt;I use these helpers in&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;for the user feedback functionality. I got a lot of valuable feedback and great suggestions via this feature.&lt;br /&gt;The user can invoke this&amp;nbsp;functionality&amp;nbsp;on the about page of the app and it's also fired when an unhandled exception&amp;nbsp;occurred&amp;nbsp;and the user wants to send error details.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;System Information&lt;/b&gt;&lt;br /&gt;It's always useful to include some system, version and device information in such a feedback report. That's why I wrote a SytemInformation class which queries some paramteres and creates a nice, human readable string.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public class SystemInformation&lt;br /&gt;{&lt;br /&gt;   public static string Dump()&lt;br /&gt;   {&lt;br /&gt;      var builder = new StringBuilder();&lt;br /&gt;      builder.AppendLine("***** System Infos *****");&lt;br /&gt;      builder.AppendLine();&lt;br /&gt;      builder.AppendFormat("Time: {0}", DateTime.Now.ToUniversalTime().ToString("r"));&lt;br /&gt;      builder.AppendLine();&lt;br /&gt;      builder.AppendFormat("Culture: {0}", CultureInfo.CurrentCulture);&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("App Version: {0}", WmAppManifestHelper.GetVersion());&lt;br /&gt;      builder.AppendLine();  &lt;br /&gt;      builder.AppendFormat("Manufacturer: {0}", DevicePropertiesHelper.GetDeviceManufacturer());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("Model: {0}", DevicePropertiesHelper.GetDeviceModel());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("DeviceHardwareVersion: {0}", DevicePropertiesHelper.GeDeviceHardwareVersion());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("DeviceFirmwareVersion: {0}", DevicePropertiesHelper.GeDeviceFirmwareVersion());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("OS  Version: {0}", Environment.OSVersion);&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("CLR Version: {0}", Environment.Version);&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("Device Type: {0}", Microsoft.Devices.Environment.DeviceType);&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("Network Type: {0}", NetworkInterface.NetworkInterfaceType);&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("DeviceTotalMemory: {0:f3} MB", DevicePropertiesHelper.GetTotalMemoryMb());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("ApplicationPeakMemoryUsage: {0:f3} MB", DevicePropertiesHelper.GetPeakMemoryUsageMb());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      builder.AppendFormat("ApplicationCurrentMemoryUsage: {0:f3} MB", DevicePropertiesHelper.GetCurrentMemoryUsageMb());&lt;br /&gt;      builder.AppendLine(); &lt;br /&gt;      using (var appStorage = IsolatedStorageFile.GetUserStoreForApplication())&lt;br /&gt;      {&lt;br /&gt;         builder.AppendFormat("Iso Storage AvailableFreeSpace: {0:f3} MB", appStorage.AvailableFreeSpace / 1024f / 1024f);&lt;br /&gt;         builder.AppendLine();&lt;br /&gt;      }&lt;br /&gt;      return builder.ToString();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;As you can see a few interesting properties from the OS, the device and its configuration and memory status are queried. This is done with built-in and custom helper classes.&lt;br /&gt;The WmAppManifestHelper class parses the &lt;a href="http://msdn.microsoft.com/en-us/library/ff769509(v=vs.92).aspxl"&gt;WmAppManifest.xml&lt;/a&gt; file and provides the app version and other properties from this file. The DevicePropertiesHelper wraps the &lt;a href="http://msdn.microsoft.com/en-us/library/ff707583(v=VS.92).aspx"&gt;DeviceExtendedProperties&lt;/a&gt; class and the available property keys. I added all the keys I need, but not more (&lt;a href="http://en.wikipedia.org/wiki/You_ain't_gonna_need_it"&gt;YAGNI&lt;/a&gt;). However, if you add more&amp;nbsp;property&amp;nbsp;keys to the class, please make sure to post a comment.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Email Service&lt;/b&gt;&lt;br /&gt;The EmailService class wraps the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.emailcomposetask(v=vs.92).aspx"&gt;EmailComposeTask&lt;/a&gt; and adds the system infos to the body of the email.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public class EmailService&lt;br /&gt;{&lt;br /&gt;   private readonly EmailComposeTask emailComposeTask;&lt;br /&gt;&lt;br /&gt;   public string Addressee { get; set; }&lt;br /&gt;&lt;br /&gt;   public EmailService()&lt;br /&gt;   {      &lt;br /&gt;      Addressee = "foo@bar.com";&lt;br /&gt;      emailComposeTask = new EmailComposeTask();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void ShowTask(string subject, string body)&lt;br /&gt;   {&lt;br /&gt;      // Add system infos add the end of the email&lt;br /&gt;      body += Environment.NewLine;&lt;br /&gt;      body += Environment.NewLine;&lt;br /&gt;      body += Environment.NewLine;&lt;br /&gt;      body += Environment.NewLine;&lt;br /&gt;      body += SystemInformation.Dump();&lt;br /&gt;&lt;br /&gt;      // Fill email&lt;br /&gt;      emailComposeTask.To = Addressee;&lt;br /&gt;      emailComposeTask.Subject = subject;&lt;br /&gt;      emailComposeTask.Body = body;&lt;br /&gt;&lt;br /&gt;      // Invoke Mail Task&lt;br /&gt;      emailComposeTask.Show();&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;The ShowTask method sets the properties of the EmailCompoaseTask and opens it.&amp;nbsp;The addressee can be defined with the corresponding property.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bar.com/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TRB-TfGTbQI/AAAAAAAAAOw/S-amZjURECU/s200/sad_foo_at_bar.gif" width="198" /&gt;&lt;/a&gt;&lt;br /&gt;Please replace the foo@bar.com default value for Addressee with your email address. Think about the poor &lt;a href="http://bar.com/"&gt;Foo at bar.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Handling the Unhandled&lt;/b&gt;&lt;br /&gt;This email functionality is used to enable explicit user feedback when the user taps the 'submit feedback' button. It is also&amp;nbsp;utilized&amp;nbsp;in the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.application.unhandledexception(v=vs.95).aspx"&gt;UnhandledException event&lt;/a&gt; handler of the Application class. The default body of the event handler in the App.xaml.cs file is generated by Visual Studio when a new Windows Phone Application project is created. Just add the email service and set the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.applicationunhandledexceptioneventargs.handled(v=VS.95).aspx"&gt;e.Handled property&lt;/a&gt; to true.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private static void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)&lt;br /&gt;{&lt;br /&gt;   var result = MessageBox.Show("An error occured. Do you want to send the error details to the developer?", "Meh", MessageBoxButton.OKCancel);&lt;br /&gt;   if (result == MessageBoxResult.OK)&lt;br /&gt;   {&lt;br /&gt;      new EmailService().ShowTask("App error", e.ExceptionObject.ToString());&lt;br /&gt;   } &lt;br /&gt;   e.Handled = true;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The body of such an error email would then look like this&lt;br /&gt;&lt;pre class="brush: text;"&gt;System.ArgumentException: The parameter is incorrect. &lt;br /&gt;   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)&lt;br /&gt;   at MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper obj, DependencyProperty property, DependencyObject doh)&lt;br /&gt;   at MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper doh, DependencyProperty property, Object obj)&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;***** System Infos *****&lt;br /&gt;&lt;br /&gt;Time: 12/11/2010 5:50:02 PM&lt;br /&gt;Culture: en-US&lt;br /&gt;App Version: 1.9.0.0&lt;br /&gt;Manufacturer: SAMSUNG&lt;br /&gt;Modell: SGH-i917&lt;br /&gt;DeviceHardwareVersion: 3.1.0.7&lt;br /&gt;DeviceFirmwareVersion: 2103.10.10.1&lt;br /&gt;OS  Version: Microsoft Windows CE 7.0.7004&lt;br /&gt;CLR Version: 3.7.10218.0&lt;br /&gt;Device Type: Device&lt;br /&gt;Network Type: MobileBroadbandGsm&lt;br /&gt;DeviceTotalMemory: 475.469 MB&lt;br /&gt;ApplicationPeakMemoryUsage: 63.055 MB&lt;br /&gt;ApplicationCurrentMemoryUsage: 41.223 MB&lt;br /&gt;Iso Storage AvailableFreeSpace: 601.641 MB&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;User feedback is always valuable and every serious Windows Phone developer should at least add a simple functionality like the one presented here.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source Code&lt;/b&gt;&lt;br /&gt;You can download all mentioned classes &lt;a href="http://dl.dropbox.com/u/2681028/Downloads/Development/SourceCode/SystemInfosAndFeedbackClasses.zip"&gt;here&lt;/a&gt;. Please comment if you know more useful system infos that should be included.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6835086724640732698?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6835086724640732698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/12/listen-to-your-phone-getting-user.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6835086724640732698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6835086724640732698'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/12/listen-to-your-phone-getting-user.html' title='Listen to your Phone - Getting User Feedback with System Information'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TLeISc7tbZI/AAAAAAAAAM8/IaQglsEADpk/s72-c/VideoLogo_192x192.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-2168023189518271344</id><published>2010-12-09T23:59:00.005+01:00</published><updated>2011-09-19T22:13:58.394+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='JPEG'/><title type='text'>Issue with the WP7 PictureDecoder and Workaround</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TQFSl8SyuKI/AAAAAAAAAOs/p3U2KzIwvEM/s1600/PicturesLab_1989_FX_2010-12-09_23-05-27.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TQFSl8SyuKI/AAAAAAAAAOs/p3U2KzIwvEM/s1600/PicturesLab_1989_FX_2010-12-09_23-05-27.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;This is fixed in the WP 7.1 SDK / &amp;nbsp;WP 7.5 / Mango!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;I noticed a strange behavior of the Windows Phone PictureDecoder &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.picturedecoder.decodejpeg(VS.92).aspx"&gt;DecodeJpeg&lt;/a&gt; method while I was working on my&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;app.&lt;br /&gt;This short post describes the issue I encountered and also provides a workaround.&lt;br /&gt;The built-in DecodeJpeg method decodes a &lt;a href="http://en.wikipedia.org/wiki/JPEG"&gt;JPEG&lt;/a&gt;&amp;nbsp;image stream into a WriteableBitmap. The method has &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.picturedecoder.decodejpeg(VS.92).aspx"&gt;two overloads&lt;/a&gt;, where the first only takes the JPEG stream and &lt;a href="http://msdn.microsoft.com/en-us/library/ff708027(v=VS.92).aspx"&gt;the second&lt;/a&gt; also uses parameters for the maximum width and height of the output. I encountered a strange&amp;nbsp;behavior&amp;nbsp;of the latter method.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Issue&lt;/b&gt;&lt;br /&gt;The DecodeJpeg method with 3 parameters swaps the width and the height parameters when a landscape photo should be resized.&amp;nbsp;For example, an image with the original size of 3264 x 2448 should be decoded to a WriteableBitmap and resized to 1024 x 768. But the resulting output will have a size of 768 x 576 cause the method swapped the input parameters while preserving the correct aspect ratio.&lt;br /&gt;Please note that this only happens with landscape pictures, which means the width of the image is greater than the height.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Will it get fixed?&lt;/b&gt;&lt;br /&gt;Yes! I contacted Microsoft and they confirmed this issue and said that it will get fixed in a future version of the Windows Phone Silverlight runtime.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Workaround&lt;/b&gt;&lt;br /&gt;Isolating the cause of this strange behavior took a bit of time, fortunately the easier was the obvious workaround.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;int w = desiredOutputWidth;&lt;br /&gt;int h = desiredOutputHeight;&lt;br /&gt;&lt;br /&gt;// Workaround for&amp;nbsp;issue in DecodeJpeg method:&lt;br /&gt;// Swap width and height for landscape pictures.&lt;br /&gt;if (originalWidth &amp;gt; originalHeight)&lt;br /&gt;{&lt;br /&gt;   w ^= h;&lt;br /&gt;   h ^= w;&lt;br /&gt;   w ^= h;&lt;br /&gt;}&lt;br /&gt;var writeableBitmap = PictureDecoder.DecodeJpeg(jpegStream, w, h);&lt;/pre&gt;The code tests if the original width is greater than the height and then swaps the output width and height using the good old &lt;a href="http://en.wikipedia.org/wiki/XOR_swap_algorithm"&gt;XOR swap trick&lt;/a&gt;.&lt;br /&gt;Alternatively you can avoid the DecodeJpeg overload with the resizing functionality, decode the full sized image and use the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt; Resize method afterwards. It produces similar results when bilinear interpolation is used, but it's an extra step that costs resources.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small; font-style: italic;"&gt;The above photo was taken with a HTC Mozart and edited with&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small; font-style: italic;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small; font-style: italic;"&gt;&lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small; font-style: italic;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small; font-style: italic;"&gt;(cropped, rotated and 1989 vintage effect).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-2168023189518271344?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/2168023189518271344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/12/issue-with-wp7-picturedecoder-and_09.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2168023189518271344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2168023189518271344'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/12/issue-with-wp7-picturedecoder-and_09.html' title='Issue with the WP7 PictureDecoder and Workaround'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TQFSl8SyuKI/AAAAAAAAAOs/p3U2KzIwvEM/s72-c/PicturesLab_1989_FX_2010-12-09_23-05-27.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4412911243471046077</id><published>2010-12-09T22:20:00.006+01:00</published><updated>2010-12-10T09:49:24.321+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Windows Phone Unplugged - How to Detect the Zune Software</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TQE4JQKOlfI/AAAAAAAAAOk/NWXiTLOjHY4/s1600/PicturesLab_Lomo_FX_2010-12-09_20-40-31.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TQE4JQKOlfI/AAAAAAAAAOk/NWXiTLOjHY4/s1600/PicturesLab_Lomo_FX_2010-12-09_20-40-31.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I've been blogging about Windows Phone development since the first CTP version and also &lt;a href="http://kodierer.blogspot.com/2010/07/photos-photos-photos-how-to-save-load.html"&gt;blogged about the photo and camera API&lt;/a&gt;.&lt;br /&gt;This post will cover a little trick my &lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt; app uses to detect if the Zune software is running when the device is connected to the PC.&amp;nbsp;This is important because the device's media Hubs can't be accessed when the device is connected and the Zune software is running. The same is true for the media APIs (&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photochoosertask(VS.92).aspx"&gt;PhotoChooser&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary.aspx"&gt;MediaLibrary&lt;/a&gt;, ...).&lt;br /&gt;The Pictures Hub and the Zune Hub show a little animation when you try to open these while Zune is running.&amp;nbsp;Unfortunately&amp;nbsp;there's no built-in method to detect this in code.&lt;br /&gt;&lt;br /&gt;An app mostly performs the classic &lt;a href="http://en.wikipedia.org/wiki/IPO_Model"&gt;IPO Model&lt;/a&gt; operations: load, process, save. The load and save steps can fail when Zune is connected.&amp;nbsp;The&amp;nbsp;following&amp;nbsp;two code snippets show how to detect if the Zune software is running and ask the user to close it. I use the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photochoosertask(VS.92).aspx"&gt;PhotoChooser&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary.aspx"&gt;MediaLibrary&lt;/a&gt;&amp;nbsp;here to demonstrate this exemplarily for picture handling, but the same is also valid for other media like audio.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Save fail&lt;/b&gt;&lt;br /&gt;If the device is connected to the PC and the Zune software is running, an InvaildOperationException is thrown.&lt;br /&gt;By the way, this&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/07/photos-photos-photos-how-to-save-load.html"&gt;blog post&lt;/a&gt;&amp;nbsp;covered how to save a WriteableBitmap as JPEG to the device's media library.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private static void Save(WriteableBitmap bitmap)&lt;br /&gt;{&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;      SaveToMediaLibrary(bitmap, "mySuperCoolPic.jpg");&lt;br /&gt;   }&lt;br /&gt;   catch (InvalidOperationException)&lt;br /&gt;   {&lt;br /&gt;      MessageBox.Show("The Zune software is running and the picture can't be saved. Please close Zune or disconnect the phone.");&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;This is quite straightforward.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load fail&lt;/b&gt;&lt;br /&gt;Unfortunately it's not that easy to detect if the Zune software is running when a picture is opened through the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photochoosertask(VS.92).aspx"&gt;PhotoChooserTask&lt;/a&gt; API. (How to use this Task was also covered &lt;a href="http://kodierer.blogspot.com/2010/07/photos-photos-photos-how-to-save-load.html"&gt;here&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Some users contacted me when they tried to open a photo with Pictures Lab and nothing happened. The problem is that the picture viewer just won't open when the PhotoChooserTask.Show method is called and Zune is running on the PC. There's no built-in feedback here. I implemented the following code in the Completed event handler of the PhotoChooserTask to get a better user&amp;nbsp;experience.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void PhotoProviderTaskCompleted(object sender, PhotoResult e)&lt;br /&gt;{&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;      if (e != null)&lt;br /&gt;      {&lt;br /&gt;         if (e.TaskResult == TaskResult.OK)&lt;br /&gt;         {&lt;br /&gt;            // Do something with the JPEG stream in e.ChosenPhoto&lt;br /&gt;         }&lt;br /&gt;         else if (e.Error is InvalidOperationException)&lt;br /&gt;         {&lt;br /&gt;            throw e.Error;&lt;br /&gt;         }&lt;br /&gt;         else if (e.TaskResult == TaskResult.Cancel)&lt;br /&gt;         {&lt;br /&gt;            // Try to get an image from the Pictures Hub. &lt;br /&gt;            // If this fails, the device is connected and Zune is running.&lt;br /&gt;            var pictures = new MediaLibrary().Pictures;&lt;br /&gt;            if(pictures.Count &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;               pictures[0].GetThumbnail();&lt;br /&gt;            }&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   catch (InvalidOperationException)&lt;br /&gt;   {&lt;br /&gt;      MessageBox.Show("The Zune software is running and the picture can't be saved. Please close Zune or disconnect the phone.");&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;One might wonder why the MediaLibrary is queried when the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photoresult(VS.92).aspx"&gt;PhotoResult&lt;/a&gt; EventArgs has the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.taskeventargs.error(v=VS.92).aspx"&gt;Error&lt;/a&gt; property. Unfortunately it's not used when Zune is running, only the TaskResult is set to Cancel in this case. This TaskResult value is also used when the user presses the back button while&amp;nbsp;choosing&amp;nbsp;a photo and it's not clear why the TaskResult was set to Cancel.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fin&lt;/b&gt;&lt;br /&gt;That's it. &lt;br /&gt;I hope it helps.&lt;br /&gt;Let me know if you found a better way.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;The above photo was taken with a HTC Mozart and edited with &lt;a href="http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html"&gt;Pictures Lab&lt;/a&gt; (cropped and Lomo effect).&lt;/span&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4412911243471046077?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4412911243471046077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/12/windows-phone-unplugged-how-to-detect.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4412911243471046077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4412911243471046077'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/12/windows-phone-unplugged-how-to-detect.html' title='Windows Phone Unplugged - How to Detect the Zune Software'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/TQE4JQKOlfI/AAAAAAAAAOk/NWXiTLOjHY4/s72-c/PicturesLab_Lomo_FX_2010-12-09_20-40-31.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5552923905915139800</id><published>2010-11-02T19:48:00.015+01:00</published><updated>2010-12-08T13:50:57.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Tracking Sales Statistics with the Silverlight Analytics Framework for Windows Phone</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S1hWXO5tVSI/AAAAAAAAAJc/461GaK_yzbA/s1600/ga.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S1hWXO5tVSI/AAAAAAAAAJc/461GaK_yzbA/s1600/ga.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: red;"&gt;The official statistics are now available at the &lt;a href="http://create.msdn.com"&gt;App Hub portal&lt;/a&gt;. However, this approach is capable of more than sales tracking.&lt;/div&gt;&lt;br /&gt;Are you a Windows Phone developer? Are you also curious how well your app performs in the Windows Phone Marketplace? I am!&lt;br /&gt;Some might say it doesn't matter yet, since there aren't many devices out there, but nevertheless I'd like to know my&amp;nbsp;statistics. Also O2 Germany &lt;a href="http://www.mobilecrunch.com/2010/10/31/windows-phone-7-handsets-exceeding-demand-selling-out-in-germany/"&gt;recently reported&lt;/a&gt;&amp;nbsp;they have sold out the first batch of &lt;a href="http://www.mobilecrunch.com/2010/10/11/htc-unveils-their-first-windows-phone-7-handset-the-t-mobile-hd7/"&gt;HTC HD7&lt;/a&gt; devices with sales in the 5-figure range. Unfortunately we won't see official statistics from the Marketplace any time soon. An&amp;nbsp;&lt;a href="http://create.msdn.com/"&gt;App Hub&lt;/a&gt; forum member contacted the Microsoft App Hub support and &lt;a href="http://forums.create.msdn.com/forums/p/62577/394703.aspx#394703"&gt;they told him&lt;/a&gt; that sales statistics won't be available before January 2011. Bummer!&lt;br /&gt;Fortunately we are app developers and we can implement our own statistic tracking. On the other hand this means we have to setup and pay some service and implement tracking code. Here is where the &lt;a href="http://msaf.codeplex.com/"&gt;Silverlight Analytics Framework&lt;/a&gt; and &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; come to the rescue.&lt;br /&gt;This blog post provides a step-by-step guide on how to track your app (sales) statistics with the Silverlight Analystics Framework and Google Analystics. Did I mention it's free and not only free for a limited period?&lt;br /&gt;Let's go...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setup Google Analytics&lt;/b&gt;&lt;br /&gt;If you don't have a&amp;nbsp;&lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt;&amp;nbsp;account, just sign up &lt;a href="http://www.google.com/analytics/"&gt;here&lt;/a&gt;. It's free.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create an empty HTML page with the minimum tags and upload it to some public webspace. If you don't have webspace available, just &lt;a href="http://www.dropbox.com/referrals/NTI2ODEwMjg5"&gt;create a free Dropbox account&lt;/a&gt; and put the page in the public folder.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Go to &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt;&amp;nbsp;and use the "Add Website Profile" functionality. Choose "Add a Profile for a new domain". Enter the URL of the dummy website.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The next page setup page will show the necessary Java Script tracking code. Copy the code, paste it into the dummy website and upload the website. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Your website profile is now waiting for activation. Go back to the overview and click the Edit link of your website profile. See the little yellow exclamation mark with the text "Tracking Not Installed" at&amp;nbsp;the upper right corner. Click on "Check Status". The status should change soon and the profile will become active. If not, give Google a couple of minutes and retry it then.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TM9K3bUiPgI/AAAAAAAAAOg/mFcNZ96pIhI/s1600/track_status.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TM9K3bUiPgI/AAAAAAAAAOg/mFcNZ96pIhI/s1600/track_status.PNG" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Setup the Silverlight Analytics Framework&lt;/b&gt;&lt;br /&gt;Now it's time to submit the tracking events from your app to Google Analytics. This task is pretty easy&amp;nbsp;with the help of the&amp;nbsp;&lt;a href="http://msaf.codeplex.com/"&gt;Silverlight Analytics Framework&lt;/a&gt;.&lt;br /&gt;The&amp;nbsp;Silverlight Analytics Framework&amp;nbsp;is an extensible web analytics framework mainly developed by the&amp;nbsp;Microsoft evangelist &lt;a href="http://blogs.msdn.com/b/synergist/"&gt;Michael S. Scherotter&lt;/a&gt;. It's really nice, designed in a flexible way with the use of modern technologies and open source. Google Analytics is just one of the many supported analytics services.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download the latest version from the &lt;a href="http://msaf.codeplex.com/"&gt;Codeplex site&lt;/a&gt; and install it or download the latest source code from the &lt;a href="http://msaf.codeplex.com/SourceControl/list/changesets"&gt;repository&lt;/a&gt; and build it yourself. I've chosen the latter since Michael recently implemented a nice &lt;a href="http://msaf.codeplex.com/workitem/14459"&gt;feature&lt;/a&gt;: The&amp;nbsp;Silverlight Analytics Framework for Windows Phone tracks each page view by default. In the changeset 63020 Michael added an IsPageTracking property which allows to disable the page tracking. This feature is part of the latest release 1.4.8.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add the following assembly references to your project. &lt;br /&gt;From the Silverlight for Windows Phone Framework:&amp;nbsp;System.Device,&amp;nbsp;System.Windows.Interactivity&lt;br /&gt;From the Silverlight Analytics Framework:&amp;nbsp;Microsoft.WebAnalytics,&amp;nbsp;Microsoft.WebAnalytics.Behaviors,&amp;nbsp;Google.WebAnalytics,&amp;nbsp;System.ComponentModel.Composition,&amp;nbsp;System.ComponentModel.Composition.Initialization&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a new class in your project:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public class AnalyticsService : IApplicationService&lt;br /&gt;{&lt;br /&gt;   public void StartService(ApplicationServiceContext context)&lt;br /&gt;   {&lt;br /&gt;      // Wire up MEF&lt;br /&gt;      CompositionHost.Initialize(&lt;br /&gt;         new AssemblyCatalog(&lt;br /&gt;            Application.Current.GetType().Assembly),&lt;br /&gt;            new AssemblyCatalog(typeof(Microsoft.WebAnalytics.AnalyticsEvent).Assembly),&lt;br /&gt;            new AssemblyCatalog(typeof(Microsoft.WebAnalytics.Behaviors.TrackAction).Assembly));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void StopService() { }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Go to the App.xaml file of your project and add the namespace definitions to the first tag:&lt;br /&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;Application&lt;br /&gt;    x:Class="MyApp.App"&lt;br /&gt;    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    &lt;br /&gt;    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"&lt;br /&gt;    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;&lt;br /&gt;    &lt;!-- New namespace definitions --&gt;&lt;br /&gt;    xmlns:local="clr-namespace:MyApp"&lt;br /&gt;    xmlns:ga="clr-namespace:Google.WebAnalytics;assembly=Google.WebAnalytics"&lt;br /&gt;    xmlns:mpc="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"&lt;br /&gt;    xmlns:mwa="clr-namespace:Microsoft.WebAnalytics;assembly=Microsoft.WebAnalytics"&lt;br /&gt;    &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Then add the service references inside the Application.ApplicationLifetimeObjects declaration in your App.xaml file:&lt;br /&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;Application.ApplicationLifetimeObjects&amp;gt;    &lt;br /&gt;    &amp;lt;local:AnalyticsService /&amp;gt;&lt;br /&gt;    &amp;lt;mwa:WebAnalyticsService IsPageTrackingEnabled="False"&amp;gt;&lt;br /&gt;        &amp;lt;mwa:WebAnalyticsService.Services&amp;gt;&lt;br /&gt;            &amp;lt;ga:GoogleAnalytics WebPropertyId="UA-XXXXXXX-X" /&amp;gt;&lt;br /&gt;        &amp;lt;/mwa:WebAnalyticsService.Services&amp;gt;&lt;br /&gt;    &amp;lt;/mwa:WebAnalyticsService&amp;gt;&lt;br /&gt;&amp;lt;/Application.ApplicationLifetimeObjects&amp;gt;&lt;br /&gt;&lt;/pre&gt;Most important you need to replace the WebPropertyId in the GoogleAnalytics element with the Id of your newly created Google Analytics website profile.&lt;br /&gt;I'm not interested in the page tracking, therefore I've set the IsPageTrackingEnabled property to False. You should also keep in mind that page tracking has an impact on the performance of the app. I recommend to disable it.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Since your app is now using a network connection, you need to add the ID_CAP_NETWORKING capability to your &lt;a href="http://msdn.microsoft.com/en-us/library/ff769509(v=VS.92).aspx"&gt;WMAppManifest.xml file&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;That was all to get the Silverlight Analytics Framework connected to your Google Analytics profile. It now tracks the Deactivated, Activated and Started events.&lt;br /&gt;You can find the results here:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TM8pv-PQIAI/AAAAAAAAAOY/ptzAurIvaHc/s1600/ga.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TM8pv-PQIAI/AAAAAAAAAOY/ptzAurIvaHc/s1600/ga.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Please keep in mind that it usually takes 12 - 24 hours until the tracked data shows up in Google Analytics.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Add sales tracking&lt;/b&gt;&lt;br /&gt;There's only one puzzle piece left now, the actual sales tracking. I use two Windows Phone APIs for this. First the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.marketplace.licenseinformation.istrial(v=VS.92).aspx"&gt;LicenseInformation.IsTrial&lt;/a&gt; method which tells us if the app runs in trial mode or if it was paid. The second API is the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff707583(v=VS.92).aspx"&gt;DeviceExtendedProperties&lt;/a&gt;&amp;nbsp;class with the &lt;a href="http://msdn.microsoft.com/en-us/library/ff941122(v=VS.92).aspx"&gt;DeviceUniqueId&lt;/a&gt; key which provides a unique 20 byte long hash for the phone. Such an id is needed to count unique installations.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add a new class to your project for the explicit tracking from code:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public class AnalyticsHelper&lt;br /&gt;{&lt;br /&gt;   // Injected by MEF   &lt;br /&gt;   [Import("Log")]&lt;br /&gt;   public Action&amp;lt;AnalyticsEvent&amp;gt; Log { get; set; }&lt;br /&gt;&lt;br /&gt;   public AnalyticsHelper()&lt;br /&gt;   {&lt;br /&gt;      // Inject&lt;br /&gt;      CompositionInitializer.SatisfyImports(this);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void Track(string category, string name)&lt;br /&gt;   {&lt;br /&gt;      // Track analytics event&lt;br /&gt;      Log(new AnalyticsEvent { Category = category, Name = name, });&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Call the Track method when your app launches and provide the necessary information. &lt;br /&gt;Add this code to the Application_Launching event handler in the App.xaml.cs file.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void Application_Launching(object sender, LaunchingEventArgs e)&lt;br /&gt;{&lt;br /&gt;   var analyticsHelper = new AnalyticsHelper();&lt;br /&gt;&lt;br /&gt;   // Get device id&lt;br /&gt;   var value = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");&lt;br /&gt;   var id = Convert.ToBase64String(value);&lt;br /&gt;   &lt;br /&gt;   // Track launch&lt;br /&gt;   analyticsHelper.Track("Launch All", id);&lt;br /&gt;&lt;br /&gt;   // Track if paid&lt;br /&gt;   if (!new LicenseInformation().IsTrial())&lt;br /&gt;   {&lt;br /&gt;      analyticsHelper.Track("Launch Paid", id);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Gergely Orosz (&lt;a href="http://twitter.com/GergelyOrosz"&gt;@Gergely Orosz&lt;/a&gt;) &lt;a href="http://twitter.com/#!/GergelyOrosz/status/29498609117"&gt;gave me the idea&lt;/a&gt; to track the statistics only if the phone is connected to Wi-Fi. This is pretty easy to implement, just add an if condition around the tracking: &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.net.networkinformation.networkinterface.networkinterfacetype(VS.92).aspx"&gt;NetworkInterface.NetworkInterfaceType&lt;/a&gt; == NetworkInterfaceType.Wireless80211&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The app is now using the unique id of the phone, so you have to add the ID_CAP_IDENTITY_DEVICE capability to your&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff769509(v=VS.92).aspx"&gt;WMAppManifest.xml file&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;As you can see all app launches are tracked in the category "Launch All" and all paid launches in the "Launch Paid" category. This makes it easy to see all installations and all sales directly. Needless to mention that Launch Trial = Launch All - Launch Paid.&lt;br /&gt;You can check if all works with the&amp;nbsp;&lt;a href="http://www.fiddler2.com/"&gt;Fiddler&lt;/a&gt;&amp;nbsp;or the&amp;nbsp;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx"&gt;TCPView&lt;/a&gt;&amp;nbsp;tool while using the Windows Phone emulator. By the way, the tracking is pretty fast. I measured 20 to 40 ms for each Track call when the phone was connected to Wi-Fi. &lt;br /&gt;&lt;br /&gt;The tracked events are best viewed when grouped by categories. The screenshot below shows a test with multiple launches of a phone and the emulator.&amp;nbsp;The total number of events is listed at the bottom right of the table.&amp;nbsp;Note that Unique Events aren't significant here since they only &lt;a href="http://www.google.com/support/forum/p/Google%20Analytics/thread?tid=41a4ddc37cf96e81&amp;amp;hl=en"&gt;represent&lt;/a&gt;&amp;nbsp;unique events for one session. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TM81z2J1txI/AAAAAAAAAOc/Bv9FvcXU0DM/s1600/ga_actions.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TM81z2J1txI/AAAAAAAAAOc/Bv9FvcXU0DM/s640/ga_actions.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;The id (event name) we supply through the AnalyticsEvent is mapped to the Google Analytics Event Action. You can find all event mappings and more info in the &lt;a href="http://msaf.codeplex.com/wikipage?title=Google%20Analytics"&gt;relevant Silverlight Analytics Framework documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The update I submitted to the Marketplace works nicely and I hope to see some meaningful statistics in the next weeks. I think the described method is a good way to track your sales and other statistics until the App Hub team provides the official usage / sales statistics. Actually the provided tracking functionality&amp;nbsp;is even&amp;nbsp;useful when the App Hub team provides official statistics. And it's all free without a limited timeframe.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5552923905915139800?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5552923905915139800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/11/tracking-sales-statistics-with.html#comment-form' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5552923905915139800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5552923905915139800'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/11/tracking-sales-statistics-with.html' title='Tracking Sales Statistics with the Silverlight Analytics Framework for Windows Phone'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/S1hWXO5tVSI/AAAAAAAAAJc/461GaK_yzbA/s72-c/ga.jpg' height='72' width='72'/><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-9008289172911054015</id><published>2010-11-01T20:37:00.003+01:00</published><updated>2010-11-02T01:00:18.284+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Silverlight is not dead and not undead either</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TM8UsN_m1YI/AAAAAAAAAOU/XD0G2_BjbI8/s1600/santo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TM8UsN_m1YI/AAAAAAAAAOU/XD0G2_BjbI8/s1600/santo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;No, it's alive and kicking.&lt;br /&gt;You might have heard about the rumors that came up after the PDC conference and &lt;a href="http://www.zdnet.com/blog/microsoft/microsoft-our-strategy-with-silverlight-has-shifted/7834"&gt;Bob Muglia's interview with Mary Jo Foley&lt;/a&gt;. Many people flooded Twitter and other sites with speculations that Silverlight is dead for the web. Microsoft's President of the Server and Tools Division Bob Muglia just &lt;a href="http://team.silverlight.net/announcement/pdc-and-silverlight/"&gt;clarified the situation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Make no mistake; we’ll continue to invest in Silverlight and enable developers to build great apps and experiences with it in the future."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;You should also read the &lt;a href="http://timheuer.com/blog/archive/2010/11/01/silverlight-is-dead-long-live-silverlight.aspx"&gt;blog post&lt;/a&gt; from the Silverlight program manager Tim Heuer. Without a doubt he puts all his effort into the success of Silverlight. And not to forget the Microsoft Silverlight evangelist John Papa who also proves his&amp;nbsp;commitment&amp;nbsp;to Silverlight &lt;a href="http://johnpapa.net/silverlight/committed-to-silverlight/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now let's get back to work...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;The picture is an old poster from the movie &lt;a href="http://www.imdb.com/title/tt0057471/"&gt;Santo en el Museo de Cera&lt;/a&gt; with the famous Mexican &lt;a href="http://en.wikipedia.org/wiki/Lucha_Libre"&gt;lucha libre&lt;/a&gt; wrestler &lt;a href="http://en.wikipedia.org/wiki/Santo"&gt;El Santo&lt;/a&gt;.&lt;/span&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-9008289172911054015?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/9008289172911054015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/11/silverlight-is-not-dead-and-not-undead.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/9008289172911054015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/9008289172911054015'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/11/silverlight-is-not-dead-and-not-undead.html' title='Silverlight is not dead and not undead either'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TM8UsN_m1YI/AAAAAAAAAOU/XD0G2_BjbI8/s72-c/santo.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-1486148158399402135</id><published>2010-10-18T20:47:00.059+02:00</published><updated>2011-12-20T19:51:01.740+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding4Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='picfx'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Pictures Lab for Windows Phone</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TLeISc7tbZI/AAAAAAAAAM8/IaQglsEADpk/s1600/VideoLogo_192x192.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TLeISc7tbZI/AAAAAAAAAM8/IaQglsEADpk/s1600/VideoLogo_192x192.png" /&gt;&lt;/a&gt;&lt;/div&gt;"Windows Phones are going to be absolutely amazing devices for taking pictures and dealing with pictures." - &lt;a href="http://www.microsoft.com/presspass/exec/joeb/"&gt;Joe Belfiore&lt;/a&gt; at the official Windows Phone 7 launch event in NYC. I totally agree, they are. Just think about that each device needs to have at least a 5 megapixel camera and the little camera button with the "pocket to picture" functionality. I've been working heavily to enhance this photo experience with my kind of skills.&amp;nbsp;This blog post contains information about the Windows Phone app I created and will also provide the references to how it works internally.  &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://bit.ly/PicLab" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TRtqay21QcI/AAAAAAAAAPE/JAF7NYum1uU/s1600/wp7_English_192_green.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Marketplace app description&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.windowsphone.com/en-US/apps/5db119bf-7ad5-df11-a844-00237de2db9e"&gt;Pictures Lab&lt;/a&gt;&amp;nbsp;is the&amp;nbsp;ultimate picture effects app&amp;nbsp;for all Windows Phone device types.&lt;br /&gt;&lt;a href="http://msnbc.com/"&gt;MSNBC.com&lt;/a&gt;:&amp;nbsp;"a Swiss Army knife of photo tweaks".&lt;br /&gt;&lt;a href="http://engadget.com/"&gt;Engadget.com&lt;/a&gt;:&amp;nbsp;"a must-have for WP7 devices ... the program provides a set of amazing effects and tweaks for your photos"&lt;br /&gt;&lt;a href="http://gizmodo.com/"&gt;Gizmodo.com&lt;/a&gt;&amp;nbsp;:&amp;nbsp;"Pictures Lab offers a ton of effects for your money."&lt;br /&gt;&lt;br /&gt;If you like to make beautiful photos, then this app is a perfect addition to your phone’s toolset. Pictures Lab provides you with thousands of different modifications for your photos and the WP 7.5 Mango version has a built-in take photo functionality with face detection auto focus, steady mode and much more.&amp;nbsp;Pictures Lab is  the original with high quality filters, features and great user experience. It's fast and responsive and you quickly get your job done with just a few gestures.&amp;nbsp;Often been copied, but never reached.&lt;br /&gt;Microsoft uses Pictures Lab in its presentations as a "delightful app" which "Looks and feels like an integral part of Windows Phone 7". "Uncluttered, polished experience".&lt;br /&gt;&lt;br /&gt;The app comes with almost 30 controllable, easy-to-use, but advanced effects like different vintage and hipster-like filters, Tilt Shift (miniature faking), HDR, Lomo, Soften, Auto Adjust, Sharpen, Comic, Bulge, B&amp;amp;W, Sepia and many more. Dynamic previews of the effects are shown in a list, making it possible to easily pick the right one. The high quality borders are also presented in a nice preview list and can be combined with any filter and any aspect ratio. Multiple effects can also be combined.&lt;br /&gt;It is also possible to crop, rotate and flip images. An enhanced picture and the EXIF data can be saved to the phone’s pictures hub or shared directly on Facebook, Twitter and other social networks. The app performs the image processing on the original picture in its original resolution, thus making it also possible to print the image or use it as desktop wallpaper.&lt;br /&gt;Full Pictures Hub Apps integration and support for landscape and portrait orientation.&amp;nbsp;Trial version with complete functionality only save is disabled.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;  &lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/b&gt;&lt;object height="620" width="620"&gt;&lt;param name="allowfullscreen" value="true" /&gt;    &lt;param name="allowscriptaccess" value="always" /&gt;    &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=15410057&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" /&gt;    &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=15410057&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1&amp;amp;autoplay=0&amp;amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="620" height="620"&gt;&lt;/embed&gt;&lt;/object&gt;&amp;nbsp; &lt;a href="http://youtu.be/QXwMdaiu9DI?hd=1"&gt;If YouTube works better for you.&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=563071785757928434" name="Reviews"&gt;Reviews&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The well-known site&amp;nbsp;Engadget lists it&amp;nbsp;under&amp;nbsp;&lt;a href="http://www.engadget.com/2010/12/31/just-got-a-windows-phone-7-handset-the-best-apps-accessories/"&gt;The best apps, accessories, and tips&lt;/a&gt;.&amp;nbsp;They write:&amp;nbsp;"... a must-have for WP7 devices ... the program provides a set of amazing effects and tweaks for your photos ..."&lt;/li&gt;&lt;li&gt;Gizmodo included Pictures Lab in &lt;a href="http://gizmodo.com/5687626/windows-phone-7-essential-apps-reviewed"&gt;Windows Phone 7 Essential Apps, Reviewed&lt;/a&gt;. They also recorded a video. They write: "Your phone isn't complete until you can take photos that look like they came out of a $5 camera from 1974. Pictures Lab fortunately offers a ton of other effects for your money. $2."&lt;/li&gt;&lt;li&gt;Gizmodo Australia also featured it in the article &lt;a href="http://www.gizmodo.com.au/2011/04/the-best-windows-phone-7-apps/"&gt;The Best Windows Phone 7 Apps&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://technolog.msnbc.msn.com/_news/2010/10/14/5291509-windows-phone-apps-look-good-different-than-iphones"&gt;msnbc.com wrote&lt;/a&gt;: "The app, a Swiss Army knife of photo tweaks, will be one of my first downloads."&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.techradar.com/news/phone-and-communications/mobile-phones/10-best-windows-phone-7-apps-paid-apps-903186"&gt;techradar.com wrote&lt;/a&gt; that Pictures Lab is the #1 app worth paying for: "Tilt-shift effects, crop and rotate... Pictures Lab combines the fun effects of an iPhone photo app like Hipstamatic with the useful fixes you're mostly likely to need (sharpen and - in the imminent update - crop) in a beautifully designed app that crosses the power of Silverlight with the tools of the Windows Phone 7 interface. Pick a photo, see all the possible effects as thumbnails or swipe up and down to try them one at a time."&lt;/li&gt;&lt;li&gt;&lt;a href="http://technolog.msnbc.msn.com/_news/2010/11/08/5427070-the-first-windows-phone-7-apps-you-should-grab"&gt;msnbc.com listed it in the article&lt;/a&gt;: "The first Windows Phone 7 apps you should grab"&lt;/li&gt;&lt;li&gt;&lt;a href="http://tech.uk.msn.com/features/photos.aspx?cp-documentid=155976181&amp;amp;page=7"&gt;MSN UK listed it under the&lt;/a&gt;&amp;nbsp;"20 top mobile phone app". And they put &lt;a href="http://twitpic.com/3tymxd"&gt;my fat nose on the front page&lt;/a&gt;. Fortunately&amp;nbsp;two of my girls brought the beauty back to the page.&lt;/li&gt;&lt;li&gt;America's popular &lt;a href="http://en.wikipedia.org/wiki/Wired_(magazine)"&gt;WIRED&lt;/a&gt; magazine with a circulation of 800,000 featured Pictures Lab in there special edition &lt;a href="http://www.businesswire.com/news/home/20111003006262/en/WIRED-App-Guide-Brings-Order-Chaos-App"&gt;WIRED App Guide&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;UK's popular gadget magazine &lt;a href="http://en.wikipedia.org/wiki/T3_(magazine)"&gt;T3&lt;/a&gt; with a circulation of more than 60,000&lt;a href="http://dl.dropbox.com/u/2681028/Downloads/PicturesLab/Reviews/T3_UK_02_2011.jpg"&gt; featured Pictures Lab in the 02/2011 issue&lt;/a&gt; on the page: "Killer Apps"&lt;/li&gt;&lt;li&gt;Pictures Lab was &lt;a href="http://channel9.msdn.com/Shows/Hot-Apps/Hot-Apps-Gravity-Guy-Pictures-Lab-Fuse-Spin-on-it-Bobble-Biker"&gt;featured in Channel 9's Hot Apps series&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Nokia &lt;a href="http://conversations.nokia.com/2011/12/14/nokia-lumia-800-photo-processing/"&gt;writes&lt;/a&gt; "it’s the closest thing to having Photoshop on your mobile phone."&lt;/li&gt;&lt;li&gt;Nokia included Pictures Lab in &lt;a href="http://www.nokia-smartphone.de/2011/11/28/top-of-the-apps-10-hotties-zum-downloaden/"&gt;Top of the Apps: 10 Hotties&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;All About Windows Phone &lt;a href="http://allaboutwindowsphone.com/reviews/item/13805_Pictures_Lab.php"&gt;reviewed the app&lt;/a&gt;: "Pictures Lab is one of many photo toolboxes for your smartphone, but it's the one that I enjoy using the most." and "Very, very much recommended."&lt;/li&gt;&lt;li&gt;Another very popular UK magazine &lt;a href="http://en.wikipedia.org/wiki/Stuff_(magazine)"&gt;Stuff&lt;/a&gt; wrote a &lt;a href="http://dl.dropbox.com/u/2681028/Downloads/PicturesLab/Reviews/Stuff_UK_03_2011.jpg"&gt;5 stars review in the March edition&lt;/a&gt;. They write that Pictures Lab is better than a well-known iPhone app. &amp;nbsp;&lt;/li&gt;&lt;li&gt;Germany's popular media and design magazine &lt;a href="http://de.wikipedia.org/wiki/Page_(Zeitschrift)"&gt;PAGE&lt;/a&gt; with a circulation of 20,000&lt;a href="http://dl.dropbox.com/u/2681028/Downloads/PicturesLab/Reviews/PAGE_01_2011.jpg"&gt; featured Pictures Lab in the 01/2011 issue&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Microsoft &lt;a href="http://dl.dropbox.com/u/2681028/Downloads/PicturesLab/Reviews/Mix11_Marketplace_Talk_PicturesLab.PNG"&gt;features Pictures Lab&lt;/a&gt; in their&amp;nbsp;presentation&amp;nbsp;slides for Windows Phone under the category delight: "Looks and feels like an integral part of Windows Phone 7". "Uncluttered, polished experience".&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Business_Insider"&gt;Business Insider&lt;/a&gt; &lt;a href="http://www.businessinsider.com/best-windows-phone-7-apps-2011-5#pictures-lab-is-like-instagram-for-windows-phone-7-15"&gt;writes&lt;/a&gt;&amp;nbsp;"Pictures Lab is like Instagram for Windows Phone 7. Take pictures with Pictures Lab, apply filters, and share them with friends."&lt;/li&gt;&lt;li&gt;The famous design site Smashing Magazine&amp;nbsp;included&amp;nbsp;Pictures Lab as an example in the article&amp;nbsp;&lt;a href="http://uxdesign.smashingmagazine.com/2011/12/20/introduction-designing-windows-phone-7-metro/"&gt;Introduction To Designing For Windows Phone 7 And Metro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bright Hub lists Pictures Lab as the first app in &lt;a href="http://www.brighthub.com/mobile/samsung/articles/96819.aspx"&gt;Top 5 Samsung Focus Apps&lt;/a&gt;: "It is considered one of the most popular photo editing programs on the Windows Phone platform, and for good reason. It has an array of sophisticated and beautiful effects ..."&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/APC_(magazine)"&gt;APC&lt;/a&gt; (Australian Personal Computer) &lt;a href="http://apcmag.com/best-apps-for-windows-phone-may-2011.htm"&gt;writes&lt;/a&gt;: "WP7’s best picture editing and effects app.Pictures Lab has received a lot of attention as the “go-to” image editing suite for new WP7 users – and for good reason, too."&lt;/li&gt;&lt;li&gt;&lt;a href="http://windowsphone.mobilitydigest.com/wp7-mega-post-new-apps-new-videos-new-name/"&gt;Mobility Digest wrote&lt;/a&gt;: "This app makes me happy. Tons of features, seems simple to use and it’s cheap – that’s a win! It even has a trial mode that includes all effects."&lt;/li&gt;&lt;li&gt;&lt;a href="http://windowsphone.mobilitydigest.com/a-walk-through-of-pictures-lab-for-windows-phone/"&gt;Mobility Digest also posted a walk through&lt;/a&gt;: "I didn’t realize it, but when you go to the list of available effects you get to see a preview of the effect which is really great and I have to say, I’m really impressed for how much this app can do."&lt;/li&gt;&lt;li&gt;&lt;a href="http://mobilitydigest.com/the-first-25-windows-phone-apps-to-download/"&gt;Mobility Digest listed it in&lt;/a&gt;: "The First 25 Windows Phone Apps To Download"&lt;/li&gt;&lt;li&gt;Pocket-Lint wrote in the article &lt;a href="http://www.pocket-lint.com/news/36906/best-windows-phone-7-photography-apps"&gt;Best Windows Phone 7 photography apps&lt;/a&gt;: "... the smart way to go is with Pictures Lab..."&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.maximumpc.com/article/features/16_best_windows_phone_7_apps"&gt;maximumpc.com wrote&lt;/a&gt;: "Speaking of pictures, for two bucks you can have a great little mobile suite of photo effects, fixes, and basic editing tools. The Windows Phone 7 UI language really shines through in this one."&lt;/li&gt;&lt;li&gt;Mobile Choices listed it as one of the two Windows Phone apps in &lt;a href="http://www.mobilechoices.co.uk/partner-mch~cu/guides/the-12-best-christmas-apps.html"&gt;The 12 best Christmas apps&lt;/a&gt;: "...turning lifeless images into photographic masterpieces..."&lt;/li&gt;&lt;li&gt;The blog Noisecast recorded a &lt;a href="http://www.thenoisecast.com/2011/02/video-review-pictures-lab.html"&gt;nice video review&lt;/a&gt;: "The program @PicturesLab is the best photo editor for Windows Phone 7, hands down."&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.1800pocketpc.com/2010/10/19/looking-for-a-photography-app-take-a-look-at-pictures-lab-for-wp7.html"&gt;1800pocketpc.com wrote&lt;/a&gt;: "If you love to add effects to your picture then this is one app video you wouldn’t want to miss."&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.1800pocketpc.com/2010/12/18/pictures-lab-photo-effects-application-for-windows-phone-7.html"&gt;1800pocketpc.com also wrote a review including a video&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wpcentral.com/pictures-lab-joins-windows-phone-7-app-lineup"&gt;wpcentral.com wrote&lt;/a&gt;: "... interesting photo effect application."&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobiledownloadblog.com/2010/10/photography-app-picture-lab-for-windows.html"&gt;mobiledownloadblog.com wrote&lt;/a&gt;: "There is no doubt that any phone device is incomplete without good picture depiction. A fantastic photograph app known as Picture Lab is now available for Windows Phone 7."&lt;/li&gt;&lt;li&gt;&lt;a href="http://techland.com/entertainment-apps/other-useful-apps/"&gt;Techland.com has it on the list&lt;/a&gt;: "50 Windows Phone 7 Apps to Get You Started"&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobiledownloadblog.com/2010/12/samsung-focus-30-best-wp7-applications.html"&gt;mobiledownloadblog.com has it on the list&lt;/a&gt;: "Samsung Focus: 30 Best WP7 Applications"&lt;/li&gt;&lt;li&gt;The German site &lt;a href="http://www.phoneseven.de/foto-effekte-mit-pictures-lab-fur-windows-phone-7/"&gt;phoneseven.de wrote&lt;/a&gt;: "Die App sieht wirklich klasse aus und lässt sich allem Anschein nach wirklich gut bedienen. Wer also befürchtet hat, dass Windows® Phone 7 zu wenig Möglichkeiten für gute Apps bietet, der wird mit Pictures Lab sicherlich eines besseren belehrt. Die App wird sicherlich zu meinen ersten Käufen aus dem Marketplace gehören."&lt;/li&gt;&lt;li&gt;The&amp;nbsp;Portuguese&amp;nbsp;site &lt;a href="http://www.pcdebolso.com/notVer.asp?id=6619"&gt;pcdebolso.com also wrote an article&lt;/a&gt;: "Pictures Lab a caminho do Windows phone 7"&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wynapse.com/WP7/Reviews/PicturesLabReview.aspx"&gt;Dave Campbell wrote a nice review&lt;/a&gt;: "All-in-all, I give Pictures Lab 5 stars"&lt;/li&gt;&lt;li&gt;&lt;a href="http://johnpapa.net/silverlight/test-run-of-5-of-your-windows-phone-7-apps/"&gt;John Papa wrote&lt;/a&gt;: "Overall, very nice app, good UI, snappy (which was a surprise to me since it does a lot)."&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;Feature list&lt;/b&gt; &lt;br /&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul style="font-weight: normal;"&gt;&lt;li&gt;29 advanced effects: Ten different vintage and hipster-like effects, Tilt Shift (miniature faking), HDR, Lomo, Soften, Auto Adjust, Sharpen, Comic, Bulge, B &amp;amp; W, Sepia, Manual, Edge Detection, Night Vision, Rainbow, Mirror, X-Ray, Heat Image, Negative and Bitmap.&lt;/li&gt;&lt;li&gt;Editable effect parameters with ready-to-use default values.&lt;/li&gt;&lt;li&gt;Combination of multiple effects.&lt;/li&gt;&lt;li&gt;11 high quality borders and more seasonal borders.&lt;/li&gt;&lt;li&gt;Share on Facebook, Twitter and other social networks.&lt;/li&gt;&lt;li&gt;The WP 7.5 Mango version has a built-in take photo functionality with face detection auto focus, steady mode, rule of thirds grid. The steady mode requires a device with a gyroscope. The face focus is enabled if the device supports focus at point.&lt;/li&gt;&lt;li&gt;Crop, rotate and flip.&lt;/li&gt;&lt;li&gt;Multi-touch manipulation for Tilt Shift and other effects where multi-touch is meaningful.&lt;/li&gt;&lt;li&gt;The app can save edited pictures with advanced effects applied in full resolution even on a device with 256 MB RAM. Thus making it also possible to print the image or use it as desktop wallpaper.&lt;/li&gt;&lt;li&gt;Full Pictures Hub Extras integration.&lt;/li&gt;&lt;li&gt;The trial version includes the complete functionality and all the effects, only the save functionality is disabled.&lt;/li&gt;&lt;li&gt;Support for landscape and portrait orientation.&lt;/li&gt;&lt;li&gt;Effect list with dynamic previews and caching of the larger previews.&lt;/li&gt;&lt;li&gt;Flicking through the effects on the main page.&lt;/li&gt;&lt;li&gt;Setting for the maximum output size, JPEG quality and many more.&lt;/li&gt;&lt;li&gt;State preservation when the app is deactivated (tombstoning).&lt;/li&gt;&lt;li&gt;Localization for English, German, Japanese, Russian, Dutch, French, Italian, Spanish, Portuguese and Portuguese (Brasil).&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-OS9iF2LHMJ4/ToNy0-m7lOI/AAAAAAAAAVU/4EL5aWy73Rc/s1600/collage_512.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-OS9iF2LHMJ4/ToNy0-m7lOI/AAAAAAAAAVU/4EL5aWy73Rc/s1600/collage_512.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TLtAj4zLPbI/AAAAAAAAAN8/HZDcgkTvBAU/s1600/Landscape_1972.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TLtAj4zLPbI/AAAAAAAAAN8/HZDcgkTvBAU/s400/Landscape_1972.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-J7PEae3cWuU/TdOG8IqC4QI/AAAAAAAAAQs/ff8LzF_AIZs/s1600/Lomo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-J7PEae3cWuU/TdOG8IqC4QI/AAAAAAAAAQs/ff8LzF_AIZs/s400/Lomo.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TL2Zw-HDLGI/AAAAAAAAAOA/Tmy8x0neULI/s1600/Marketplace_panoramic_background.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TL2Zw-HDLGI/AAAAAAAAAOA/Tmy8x0neULI/s400/Marketplace_panoramic_background.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ugj-w1HU1iM/TdOHFLw31oI/AAAAAAAAAQw/CjxJtsLXDj8/s1600/CropRotate.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-ugj-w1HU1iM/TdOHFLw31oI/AAAAAAAAAQw/CjxJtsLXDj8/s400/CropRotate.PNG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;Go to&lt;/b&gt;&lt;br /&gt;You can follow &lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=5db119bf-7ad5-df11-a844-00237de2db9e&amp;amp;source=KodiererV1"&gt;this link&lt;/a&gt; if you have the &lt;a href="http://www.zune.net/en-us/products/software/download/"&gt;Zune software&lt;/a&gt; installed and your browser supports Zune links. Or just open the &lt;a href="http://www.windowsphone.com/en-US/apps/5db119bf-7ad5-df11-a844-00237de2db9e"&gt;web Marketplace&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How it works&lt;/b&gt; &lt;br /&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Some of the image processing algorithms that are used in the Pictures Lab app would normally be implemented as pixel shaders for Silverlight. The Windows Phone platform doesn't support custom pixel shaders at the moment, therefore all effects are implemented in C# and manipulate the WriteabeBitmap Pixels' in some way. How this works in detail&amp;nbsp;was shown in my&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/coding4fun/archive/2010/08/09/10048007.aspx"&gt;Coding4Fun articles&lt;/a&gt;&amp;nbsp;I've written months ago. This is actually where Pictures Lab has its roots. The first article described all the necessary basics and two simple effects. The second part of this short Coding4Fun article series shows how to implement the basic tilt shift and vintage effects you can find in the Pictures Lab app.&amp;nbsp;&lt;b&gt;Yes, some parts are open source!&amp;nbsp;&lt;/b&gt;Except the secret sauces I gotta keep for me that adds the final touch to the effects. I also wrote blog posts about some parts of the application that are surely interesting for other Windows Phone developers.&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The Slider control that is used in the App was originally developed by &lt;a href="http://nokola.com/"&gt;Nokola&lt;/a&gt; and then adapted for Windows Phone and made bindable by &lt;a href="http://www.betterthaneveryone.com/"&gt;Clint Rutkas&lt;/a&gt; and myself.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;To be continued&lt;/b&gt;&lt;br /&gt;The planned feature list for the next versions is already pretty long and I have some real diamonds on there. You can follow &lt;a href="http://twitter.com/PicturesLab"&gt;@PicturesLab&lt;/a&gt; on Twitter to get all the status updates. I'd also like to know what feature you want to see in a future version. Just write a comment.&lt;br /&gt;&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fapps%2Fapplication.php%3Fid%3D270241366323280&amp;amp;width=256&amp;amp;colorscheme=light&amp;amp;show_faces=false&amp;amp;border_color&amp;amp;stream=false&amp;amp;header=false&amp;amp;height=62" style="border: none; height: 62px; overflow: hidden; width: 256px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-1486148158399402135?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/1486148158399402135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1486148158399402135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1486148158399402135'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/10/announcing-pictures-lab-for-windows.html' title='Pictures Lab for Windows Phone'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TLeISc7tbZI/AAAAAAAAAM8/IaQglsEADpk/s72-c/VideoLogo_192x192.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-8638448462018064273</id><published>2010-09-20T20:56:00.002+02:00</published><updated>2010-09-21T01:33:45.800+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Windows Phone Memory Constraints</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TJZMrEy8JcI/AAAAAAAAAM4/GdjL8k9ruNk/s1600/amiga_ram.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TJZMrEy8JcI/AAAAAAAAAM4/GdjL8k9ruNk/s1600/amiga_ram.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The final &lt;a href="http://developer.windowsphone.com/windows-phone-7/"&gt;Windows Phone Developer Tools&lt;/a&gt; have been released and the launch date is not far away. It's time to finalize the apps.&lt;br /&gt;Windows Phone has some &lt;a href="http://www.engadget.com/2010/03/18/windows-phone-7-series-the-complete-guide/"&gt;tough hardware requirements&lt;/a&gt;, but it's still a mobile platform with limited resources.&amp;nbsp;In this blog post I'll describe how to determine the current memory usage, what the allowed maximum is&amp;nbsp;to get your app approved for the Marketplace and other constraints&amp;nbsp;a developer&amp;nbsp;should&amp;nbsp;be aware of.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Maximum memory usage&lt;/b&gt;&lt;br /&gt;The Windows Phone hardware specifications requires that a device has 256 MB RAM or more.&amp;nbsp;The allowed maximum memory an app can use is defined in the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=183220"&gt;Windows Phone 7 Application Certification Requirements&lt;/a&gt; at point 5.2.5&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;The application must not exceed 90 MB of RAM usage. However, on devices that have more than 256 MB of memory, an application can exceed 90 MB of RAM usage.&lt;/i&gt;&lt;/blockquote&gt;One might now ask how to get this information at runtime.&amp;nbsp;Fortunately there's the &lt;a href="http://msdn.microsoft.com/en-us/library/ff707583(v=VS.92).aspx"&gt;DeviceExtendedProperties&lt;/a&gt; class to obtain some device information at runtime. This class defines the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.info.deviceextendedproperties.getvalue(v=VS.92).aspx"&gt;GetValue&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.info.deviceextendedproperties.trygetvalue(v=VS.92).aspx"&gt;TryGetValue&lt;/a&gt; methods which expect a string key as parameter. The list of available property keys is defined &lt;a href="http://msdn.microsoft.com/en-us/library/ff941122(v=VS.92).aspx"&gt;here&lt;/a&gt;. Among other interesting properties like the DeviceUniqueId, it's possible to retrieve the DeviceTotalMemory, the ApplicationCurrentMemoryUsage and the ApplicationPeakMemoryUsage. The property keys are interpreted case-sensitive. &lt;br /&gt;The application needs to define the device identity capability in the WMAppManifest.xml file in order to retrieve the&amp;nbsp;DeviceUniqueId property, but it's &lt;u&gt;not&lt;/u&gt; needed for the other keys like the&amp;nbsp;ApplicationPeakMemoryUsage.&lt;br /&gt;&lt;br /&gt;Here's the code to get the peak memory usage and the available total memory at runtime:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;var timer = new DispatcherTimer {Interval = TimeSpan.FromSeconds(2)};&lt;br /&gt;timer.Tick += (s, e) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;   var memuse = (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage");&lt;br /&gt;   var maxmem = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory");&lt;br /&gt;   memuse /= 1024 * 1024;&lt;br /&gt;   maxmem /= 1024 * 1024;&lt;br /&gt;   MyTextBlock.Text = String.Format("Mem usage: {0} / {1} MB", memuse, maxmem);&lt;br /&gt;};&lt;br /&gt;timer.Start();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The timer checks the properties every two seconds and converts the bytes to MB. The values are then shown in a TextBlock. The peak memory is the most interesting since this value must not exceed 90 MB on a device with 256 MB. Also note that an empty application with two grids and a TextBlock already has a peak of 5 - 7 MB in the emulator or on a device.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PhoneApplicationPage.State limitation&lt;/b&gt; &lt;br /&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.controls.phoneapplicationpage.state(v=VS.92).aspx"&gt;PhoneApplicationPage.State property&lt;/a&gt; is typically used to save transient state for &lt;a href="http://msdn.microsoft.com/en-us/library/ff817008(VS.92).aspx"&gt;tombstoning&lt;/a&gt;. The size of the State data is&amp;nbsp;limited&amp;nbsp;to 2 MB for a Page and 4 MB for the whole application. Be warned, if this limit is reached a not very descriptive exception is thrown. The message text is&amp;nbsp;&lt;i&gt;"The client who called IAccessControl::IsAccessPermitted was the trustee provided tot he method"&lt;/i&gt;.&lt;br /&gt;If more than 2 / 4 MB is needed to save transient data, the &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile(v=VS.95).aspx"&gt;IsolatedStorage&lt;/a&gt; can be used. The applications IsolatedStorage is only limited by the device's flash storage size. The minimum&amp;nbsp;requirement&amp;nbsp;for Windows Phone is 8 GB. The available free isolated storage in bytes can be retrieved with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile.availablefreespace(VS.95).aspx"&gt;AvailableFreeSpace&lt;/a&gt; property of the &lt;a href="http://msdn.microsoft.com/en-us/library/c76z57x8(v=VS.95).aspx"&gt;IsolatedStorageFile&lt;/a&gt; class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-8638448462018064273?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/8638448462018064273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/09/windows-phone-memory-constraints.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8638448462018064273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8638448462018064273'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/09/windows-phone-memory-constraints.html' title='Windows Phone Memory Constraints'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TJZMrEy8JcI/AAAAAAAAAM4/GdjL8k9ruNk/s72-c/amiga_ram.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-3586590286531994287</id><published>2010-08-31T19:10:00.000+02:00</published><updated>2010-08-31T19:10:48.977+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Rect and Point Extension Methods</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/THgQI_PUjOI/AAAAAAAAAM0/u7ebfUf1lA4/s1600/PointRectEx.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/THgQI_PUjOI/AAAAAAAAAM0/u7ebfUf1lA4/s1600/PointRectEx.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I'm currently working on multiple Windows Phone projects and don't have much time for longer blog posts, but I just wanted to get this out.&lt;br /&gt;For one of the projects I need to calculate some simple vector arithmetics like the &lt;a href="http://en.wikipedia.org/wiki/Euclidean_distance"&gt;Euclidean distance&lt;/a&gt;. I also&amp;nbsp;need other properties of the &lt;a href="http://msdn.microsoft.com/en-us/library/ms602977(v=VS.95).aspx"&gt;Point&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms589713(v=VS.95).aspx"&gt;Rect&lt;/a&gt; structs that aren't built-in the Silverlight framework. As you might know I'm a huge fan of extension methods&amp;nbsp;for extending built-in functionality&amp;nbsp;(&lt;a href="http://writeablebitmapex.codeplex.com/"&gt;1&lt;/a&gt;,&amp;nbsp;&lt;a href="http://matrix3dex.codeplex.com/"&gt;2&lt;/a&gt;). That's why I wrote a few extension methods for the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms602977(v=VS.95).aspx"&gt;Point&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms589713(v=VS.95).aspx"&gt;Rect&lt;/a&gt;&amp;nbsp;structs that might come handy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rect&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static class RectExtensions&lt;br /&gt;{   &lt;br /&gt;   // Calculates the center point of this rectangle.&lt;br /&gt;   public static Point Center(this Rect rect)&lt;br /&gt;   {&lt;br /&gt;      return new Point(rect.X + rect.Width * 0.5, rect.Y + rect.Height * 0.5);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Tests if this rectangle intersects with the other.&lt;br /&gt;   public static bool IntersectsWith(this Rect rect, Rect other)&lt;br /&gt;   {&lt;br /&gt;      // Test for separating axis&lt;br /&gt;      if (other.Bottom &amp;lt; rect.Top || other.Right &amp;lt; rect.Left &lt;br /&gt;       || other.Top &amp;gt; rect.Bottom || other.Left &amp;gt; rect.Right)&lt;br /&gt;      {&lt;br /&gt;         return false;&lt;br /&gt;      }&lt;br /&gt;      return true;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The usage should be pretty obvious.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;Rect r = new Rect(0, 0, 200, 300);&lt;br /&gt;Point center = r.Center();&lt;br /&gt;&lt;br /&gt;bool isIntersecting = r.IntersectsWith(new Rect(500, 600, 100, 50));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Point&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static class PointExtensions&lt;br /&gt;{&lt;br /&gt;   // Calculates the distance vector of the points.&lt;br /&gt;   public static Point Distance(this Point p1, Point p2)&lt;br /&gt;   {&lt;br /&gt;      return new Point(p1.X - p2.X, p1.Y - p2.Y);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Calculates the length of the vector.&lt;br /&gt;   public static double Length(this Point p)&lt;br /&gt;   {&lt;br /&gt;      return Math.Sqrt(p.X * p.X + p.Y * p.Y);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Calculates the square length of the vector.&lt;br /&gt;   public static double LengthSquare(this Point p)&lt;br /&gt;   {&lt;br /&gt;      return p.X * p.X + p.Y * p.Y;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The squared length saves some cycles if this information is only needed for comparison.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;Point p1 = new Point(200, 300);&lt;br /&gt;Point p2 = new Point(400, 500);&lt;br /&gt;Point distance = p1.Distance(p2);&lt;br /&gt;&lt;br /&gt;double length = distance.Length();&lt;br /&gt;double lengthSq = distance.LengthSquare();&lt;br /&gt;length = Math.Sqrt(lengthSq);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Source Code&lt;/b&gt;&lt;br /&gt;You can download the two C# files from &lt;a href="http://dl.dropbox.com/u/2681028/Downloads/Development/SourceCode/Point_and_Rect_Extensions.zip"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-3586590286531994287?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/3586590286531994287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/08/rect-and-point-extension-methods.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3586590286531994287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3586590286531994287'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/08/rect-and-point-extension-methods.html' title='Rect and Point Extension Methods'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/THgQI_PUjOI/AAAAAAAAAM0/u7ebfUf1lA4/s72-c/PointRectEx.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4031413961448325265</id><published>2010-08-10T15:16:00.008+02:00</published><updated>2011-02-01T10:13:43.403+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding4Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='picfx'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='PicLab'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Coding4Fun - Part 1 of the Windows Phone Picture Effects App and Roadmap</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TGFOvfCKQyI/AAAAAAAAAMo/nf39fttlTx0/s1600/picfx.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TGFOvfCKQyI/AAAAAAAAAMo/nf39fttlTx0/s1600/picfx.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;My new &lt;a href="http://channel9.msdn.com/coding4fun/articles/PicFx--Windows-Phone-Picture-Effects-Application--Part-1"&gt;Windows Phone 7 article&lt;/a&gt; for Microsoft's&amp;nbsp;&lt;a href="http://channel9.msdn.com/coding4fun"&gt;Coding4Fun site&lt;/a&gt;&amp;nbsp;is live. It's the first part of a short series about the development of a Windows Phone 7 picture effects application called "PicFx". The &lt;a href="http://channel9.msdn.com/coding4fun/articles/PicFx--Windows-Phone-Picture-Effects-Application--Part-1"&gt;first article&lt;/a&gt; will show how to create the base Windows Phone application and how to implement some basic effects.&amp;nbsp;The source code is licensed under the&amp;nbsp;&lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Ms-PL&lt;/a&gt;&amp;nbsp;and can be downloaded from the &lt;a href="http://picfx.codeplex.com/"&gt;CodePlex site&lt;/a&gt;.&lt;br /&gt;I'm already working on the second part of the series, which will explain how to implement advanced effects (the cool stuff) and other features. After this article I'll add more features and important effects, enhance the&amp;nbsp;existing&amp;nbsp;effects and release it as "Pictures Lab" on the Marketplace.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Video&lt;/b&gt;&lt;br /&gt;The video below demonstrates the Coding4Fun PicFx application features and also shows how it can be used. It was recorded with the application running in the emulator.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="720" width="380"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13587494&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13587494&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="380" height="720"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4031413961448325265?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4031413961448325265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/08/coding4fun-windows-phone-picture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4031413961448325265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4031413961448325265'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/08/coding4fun-windows-phone-picture.html' title='Coding4Fun - Part 1 of the Windows Phone Picture Effects App and Roadmap'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TGFOvfCKQyI/AAAAAAAAAMo/nf39fttlTx0/s72-c/picfx.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-1324197474953752265</id><published>2010-08-02T21:40:00.010+02:00</published><updated>2010-08-03T09:07:12.389+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 3'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Book Review - 3D Game Development with Microsoft Silverlight 3: Beginner's Guide</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TFcgThaRmCI/AAAAAAAAAMg/xCul6XvgR44/s1600/3D+game+development.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TFcgThaRmCI/AAAAAAAAAMg/xCul6XvgR44/s1600/3D+game+development.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A couple of weeks ago I got a review copy of the book &lt;a href="http://www.packtpub.com/3d-game-development-with-microsoft-silverlight-3-beginners-guide/book/mid/2104100a0cyc?utm_source=kodierer.blogspot.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003069"&gt;3D Game Development with Microsoft Silverlight 3: Beginner's Guide&lt;/a&gt;. The book has 452 pages, is written by&amp;nbsp;&lt;a href="http://www.packtpub.com/authors/profiles/gast%C3%B3n-c-hillar"&gt;Gastón C. Hillar&lt;/a&gt;&amp;nbsp;and shows how to write games with Silverlight.&lt;br /&gt;Although&amp;nbsp;the title includes "Silverlight 3", the concepts are also valid for newer versions of Silverlight, like the current version 4.&lt;br /&gt;This blog post is a short review of the book. I also have one physical copy of the book to give away. Yeah, a free book, like free beer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;The Content&lt;/b&gt;&lt;br /&gt;The book&amp;nbsp;&lt;a href="http://www.packtpub.com/3d-game-development-with-microsoft-silverlight-3-beginners-guide/book/mid/2104100a0cyc?utm_source=kodierer.blogspot.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003069"&gt;3D Game Development with Microsoft Silverlight 3: Beginner's Guide&lt;/a&gt;&amp;nbsp;starts by explaining what tools are needed for Silverlight game development. Then the first simple Silverlight application is developed.&lt;br /&gt;The second chapter explains what &lt;a href="http://en.wikipedia.org/wiki/Sprite_(computer_graphics)"&gt;Sprites&lt;/a&gt; are, how they can be used for 2D games and frame based animations. Silverlight 2.5D hardware accelerations is also&amp;nbsp;covered&amp;nbsp;and how basic vector transformations work.&lt;br /&gt;The next chapter introduces a Sprite wrapper class and how to simplify the game loop with it. Basic 2D collision detection with an &lt;a href="http://en.wikipedia.org/wiki/Axis-aligned_bounding_box"&gt;axis-aligned bounding box&lt;/a&gt; is covered too. The author also shows in this chapter how to use keyboard input for the game control.&lt;br /&gt;Chapter 4 finally brings 3D game development. It starts with a &lt;a href="http://msdn.microsoft.com/en-us/library/aa970060.aspx"&gt;WPF XAML Browser Application&lt;/a&gt;&amp;nbsp;(XBAP) application that draws a 3D model, which was generated with the 3D modelling tool&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Blender_(software)"&gt;Blender&lt;/a&gt; and then exported to a XAML file. After this, the 3D engine &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt; is&amp;nbsp;introduced&amp;nbsp;and a simple application is created. To be honest,&amp;nbsp;&lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt;&amp;nbsp;has come a long way since the book was written and a lot of new features were&amp;nbsp;introduced. Nevertheless, many concepts and the basics are still valid.&lt;br /&gt;The next chapter explains some 3D concepts like Cameras and shows how to use them with Balder and XBAP. The 6th chapter is about input controlling and demonstrates how to use &lt;a href="http://en.wikipedia.org/wiki/DirectInput"&gt;DirectInput&lt;/a&gt;&amp;nbsp;with the XBAP application. Chapter 7 explains textures, lights and the usage of these in a game. The next chapter is all about animation.&lt;br /&gt;The 9th chapter introduces the Silverlight physics engine &lt;a href="http://farseerphysics.codeplex.com/"&gt;Farseer&lt;/a&gt;&amp;nbsp;and chapter 10 shows how to detect collisions and apply basic&amp;nbsp;artificial&amp;nbsp;intelligence. The next chapter adds an asteroid belt to the space game, which is used as an example throughout the book.&lt;br /&gt;In Chapter 12, the author shows how to measure the game progress and how to use &lt;a href="http://www.microsoft.com/expression/products/blend_overview.aspx"&gt;Expression Blend&lt;/a&gt; to create screens for highscore and other statistics. The next chapter continues with this and also explains the usage of &lt;a href="http://en.wikipedia.org/wiki/Pixel_shader"&gt;pixel shaders&lt;/a&gt; from the &lt;a href="http://wpffx.codeplex.com/"&gt;WPF Pixel Shader Effects Library&lt;/a&gt;.&amp;nbsp;Persisting&amp;nbsp;settings to the &lt;a href="http://msdn.microsoft.com/en-us/library/x7dzh4ws(v=VS.95).aspx"&gt;IsolatedStorage&lt;/a&gt; is covered too.&amp;nbsp;The last chapter&amp;nbsp;demonstrates&amp;nbsp;how to play and control audio and video with the Silverlight &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement(VS.95).aspx"&gt;MediaElement&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;If you want to get into&amp;nbsp;game development with Silverlight, this is the right book for you. It starts with the basic tools, then shows how to write a simple 2D game, finally how to write a 3D Silverlight game with &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt;&amp;nbsp;and how to&amp;nbsp;add a physics system. Another nice thing of this book is that the tools and techniques to create / convert content are also shown step-by-step.&lt;br /&gt;&lt;a href="http://www.packtpub.com/3d-game-development-with-microsoft-silverlight-3-beginners-guide/book/mid/2104100a0cyc?utm_source=kodierer.blogspot.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003069"&gt;3D Game Development with Microsoft Silverlight 3: Beginner's Guide&lt;/a&gt;&amp;nbsp;lives up to its title: "Beginner's Guide". If you are a beginner in the field of Silverlight game development and don't know where to start, buy this book &lt;a href="http://www.packtpub.com/3d-game-development-with-microsoft-silverlight-3-beginners-guide/book/mid/2104100a0cyc?utm_source=kodierer.blogspot.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003069"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Free Book!&lt;/b&gt;&lt;br /&gt;I actually got two physical copies of the book and I&amp;nbsp;like&amp;nbsp;to give one away.&amp;nbsp;If you want the book, just write a comment why you should get this gift. Make sure to include some form of contact information.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TFcfHVtkZJI/AAAAAAAAAMc/WkDbXrbk58c/s1600/sl_book.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TFcfHVtkZJI/AAAAAAAAAMc/WkDbXrbk58c/s400/sl_book.jpg" width="307" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-1324197474953752265?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/1324197474953752265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/08/book-review-3d-game-development-with.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1324197474953752265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1324197474953752265'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/08/book-review-3d-game-development-with.html' title='Book Review - 3D Game Development with Microsoft Silverlight 3: Beginner&apos;s Guide'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/TFcgThaRmCI/AAAAAAAAAMg/xCul6XvgR44/s72-c/3D+game+development.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-3924420352623887519</id><published>2010-07-19T19:50:00.003+02:00</published><updated>2011-02-01T10:09:30.461+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='JPEG'/><title type='text'>Photos, Photos, Photos - How To Save, Load And Iterate Pictures With Windows Phone 7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TENBiMmCCsI/AAAAAAAAAME/lSR27CqRnDU/s1600/medialib_Sample_Screenshot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TENBiMmCCsI/AAAAAAAAAME/lSR27CqRnDU/s1600/medialib_Sample_Screenshot.png" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;a href="http://developer.windowsphone.com/windows-phone-7/"&gt;Windows Phone developer tools&lt;/a&gt; beta version was recently released and brought &lt;a href="http://download.microsoft.com/download/4/E/A/4EA52332-C6B1-476E-9938-C4F805146AF5/Release%20Notes%20-%20WPDT%20Beta.htm"&gt;some important changes and also new features&lt;/a&gt;. For example the emulator is a lot better now and tombstoning was introduced. &lt;a href="http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/07/15/understanding-the-windows-phone-application-execution-model-tombstoning-launcher-and-choosers-and-few-more-things-that-are-on-the-way-part-1.aspx"&gt;Tombstoning is an important concept&lt;/a&gt; to know when a &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks(VS.92).aspx"&gt;Launcher or Chooser&lt;/a&gt; is being used in an app.&lt;br /&gt;But this blog post is not about tombstoning, this post will show how to load an image from the picture library with the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photochoosertask(v=VS.92).aspx"&gt;PhotoChooserTask&lt;/a&gt;. And most important how to save a picture to the library, which is not as obvious as the usage of the Task API. The last part will show how to get all images from the picture library without using the PhotoChooserTask.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sample&lt;/b&gt;&lt;br /&gt;I've built a Windows Phone 7 app that uses the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx library&lt;/a&gt; and lets the user draw on the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt;&amp;nbsp;surface. The app supports multi touch for drawing and the radius of the pen can be changed with the Slider control. An image from the phone's picture library can be chosen with the folder icon button and the floppy disk button saves the current image to the picture library. When the third button (download icon) is clicked, all pictures from the phone's library are loaded without further user interaction. The trash button clears the draw surface. &lt;br /&gt;The video below demonstrates the features and shows how to use the app.&lt;br /&gt;It would be great if anyone could try this sample app on a real device and give me some feedback. I'm especially interested how the multi touch drawing works.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="720" width="380"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13436521&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13436521&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00adef&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="380" height="720"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Background music is &lt;a href="http://softphase.org/netlabel/releases/sfp13"&gt;Soft Shapes&lt;/a&gt; by Planet Boelex.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;br /&gt;The raw touch points are handled through the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.touch.framereported(VS.95).aspx"&gt;Touch.FrameReported&lt;/a&gt; event. For each multi touch point a circle is being drawn with the WriteableBitmapEx' FillEllipseCentered method and a color map array that provides alternating colors:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void Draw(IList&amp;lt;TouchPoint&amp;gt; points)&lt;br /&gt;{&lt;br /&gt;   // Check&lt;br /&gt;   if (!isManipulating)&lt;br /&gt;   {&lt;br /&gt;      return;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Init some vars&lt;br /&gt;   var bmp = Bitmap;&lt;br /&gt;   var w = bmp.PixelWidth;&lt;br /&gt;   var h = bmp.PixelHeight;&lt;br /&gt;   var r = Radius;&lt;br /&gt;&lt;br /&gt;   // Draw&lt;br /&gt;   for (int i = 0; i &amp;lt; points.Count; i++)&lt;br /&gt;   {&lt;br /&gt;      var p = points[i].Position;&lt;br /&gt;      if (p.X &amp;lt; w &amp;amp;&amp;amp; p.Y &amp;lt; h)&lt;br /&gt;      {&lt;br /&gt;         bmp.FillEllipseCentered((int)p.X, (int)p.Y, r, r, &lt;br /&gt;                                 ColorMap[(i + colorBase) % ColorMap.Length]);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Show&lt;br /&gt;   Present();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Choose a photo&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photochoosertask(v=VS.92).aspx"&gt;PhotoChooserTask&lt;/a&gt;&amp;nbsp;allows the user to select an image. The code for this task is pretty straight forward with the beta of the developer tools.&lt;br /&gt;A member variable of the PhotoChooserTask is instantiated in the constructor and an event handler for the &lt;a href="http://msdn.microsoft.com/en-us/library/ff707989(v=VS.92).aspx"&gt;Completed&lt;/a&gt; event is attached.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public MainPage()&lt;br /&gt;{&lt;br /&gt;   // ...&lt;br /&gt;&lt;br /&gt;   // Init chooser&lt;br /&gt;   photoChooserTask = new PhotoChooserTask();&lt;br /&gt;   photoChooserTask.Completed += PhotoChooserTaskCompleted;&lt;br /&gt;   &lt;br /&gt;   // ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: c-sharp;"&gt;private void PhotoChooserTaskCompleted(object sender, PhotoResult e)&lt;br /&gt;{&lt;br /&gt;   if (e.TaskResult == TaskResult.OK)&lt;br /&gt;   {&lt;br /&gt;      // Load original image and invalidate bitmap so it gets newly rendered&lt;br /&gt;      var bitmapImage = new BitmapImage();&lt;br /&gt;      bitmapImage.SetSource(e.ChosenPhoto);&lt;br /&gt;      Viewport.Source = bitmapImage;&lt;br /&gt;      bitmap = null;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photochoosertask.show(v=VS.92).aspx"&gt;PhotoChooserTask.Show&lt;/a&gt; method is called when the corresponding Application Bar button was clicked:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void ApplicationBarIconOpenButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   photoChooserTask.Show();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Show method launches the Windows Phone photo app. The current version of the Windows Phone operating system only allows one application to run at the same time and therefore our app gets terminated when the Chooser is started. Here's where the concept of&amp;nbsp;&lt;a href="http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/07/15/understanding-the-windows-phone-application-execution-model-tombstoning-launcher-and-choosers-and-few-more-things-that-are-on-the-way-part-1.aspx"&gt;tombstoning&lt;/a&gt;&amp;nbsp;comes into play.&lt;br /&gt;After the user selected an image or pressed the back button, the Chooser's&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff707989(v=VS.92).aspx"&gt;Completed&lt;/a&gt;&amp;nbsp;event is raised. You might have noticed the black screen&amp;nbsp;in the video&amp;nbsp;that appears after the choose operation. As a result of the app termination, the Visual Studio debugging session is stopped. The Windows Phone 7 emulator detected that the app was started in a debug context and the emulator now waits at the black screen for re-attaching. So just go back to Visual Studio and hit F5 (Start Debugging), then the debugger is being re-attached and the app continues.&amp;nbsp;Of course it's also possible to&amp;nbsp;Start Without Debugging in Visual Studio.&lt;br /&gt;The&amp;nbsp;Chooser's&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff707989(v=VS.92).aspx"&gt;Completed&lt;/a&gt;&amp;nbsp;event&amp;nbsp;provides a &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photoresult(v=VS.92).aspx"&gt;PhotoResult&lt;/a&gt; that contains the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.taskeventargs.taskresult(v=VS.92).aspx"&gt;TaskResult&lt;/a&gt;, the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photoresult.originalfilename(v=VS.92).aspx"&gt;OriginalFileName&lt;/a&gt; and&amp;nbsp;the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.photoresult.chosenphoto(v=VS.92).aspx"&gt;ChosenPhoto&lt;/a&gt;&amp;nbsp;as a &lt;a href="http://msdn.microsoft.com/en-us/library/8f86tw9e(vs.95)"&gt;Stream&lt;/a&gt;. If the user hasn't cancelled the operation, the stream is used as the source of a BitmapImage which is then assigned to the WriteableBitmap draw surface (&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;Viewport&lt;/span&gt;). The user can now make some nice drawings on the photo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Save a picture&lt;/b&gt;&lt;br /&gt;After the user created his masterpiece he probably wants to save it back to the picture library / photo album. But how could this be done? There's no PhotoSaveTask available in the Silverlight SDK.&amp;nbsp;Fortunately&amp;nbsp;the Windows Phone's XNA &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary(XNAGameStudio.40).aspx"&gt;MediaLibrary&lt;/a&gt; comes to the rescue. Only a reference to the Microsoft.Xna.Framework assembly is needed to use it in our Windows Phone Silverlight application. To make this task a bit easier I wrote some reusable extension methods for the WriteableBitmap. These are located in the file&amp;nbsp;WriteableBitmapMediaLibraryExtensions.cs from the source code download. The signatures look like this:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Saves the WriteableBitmap encoded as JPEG to the Media library.&lt;br /&gt;// The quality for JPEG encoding has to be in the range 0-100, &lt;br /&gt;// where 100 is the best quality with the largest size.&lt;br /&gt;void SaveToMediaLibrary(this WriteableBitmap bitmap, string name, int quality);&lt;br /&gt;&lt;br /&gt;// Saves the WriteableBitmap encoded as JPEG to the Media library &lt;br /&gt;// using the best quality of 100.&lt;br /&gt;void SaveToMediaLibrary(this WriteableBitmap bitmap, string name);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The methods use the MediaLibrary's &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary.savepicture(v=XNAGameStudio.40).aspx"&gt;SavePicture&lt;/a&gt; method internally. The SavePicture method expects a stream or a byte array as parameter that contains an image encoded in the &lt;a href="http://en.wikipedia.org/wiki/Jpeg"&gt;JPEG format&lt;/a&gt;. For the earlier CTP versions I wrote a custom JEPG encoding functionality that used some parts of my &lt;a href="http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html"&gt;Silverlight JPEG encoding blog post&lt;/a&gt; and an adapted &lt;a href="http://code.google.com/p/fjcore/"&gt;FJCore&lt;/a&gt; version. Fortunately things got a bit easier with the Windows Phone Tools beta release. The Microsoft.Phone assembly now comes with two &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.extensions_methods(VS.92).aspx"&gt;WriteableBitmap extension methods&lt;/a&gt; called LoadJpeg and most important SaveJpeg. The SaveJpeg method expects the targetStream, the width and height of the target, the orientation which is not used at the moment and the quality in a range from 0 to 100. The width and height parameters are useful when a scaled version of the WriteableBitmap should be saved as JPEG.&lt;br /&gt;&lt;br /&gt;The current bitmap&amp;nbsp;surface&amp;nbsp;is saved as JPEG when the disk floppy button was clicked:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void ApplicationBarIconSaveButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   var name = String.Format("MediaLibSample_{0:yyyy-MM-dd_hh-mm-ss-tt}.jpg",&lt;br /&gt;                            DateTime.Now);&lt;br /&gt;   Bitmap.SaveToMediaLibrary(name);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Load all pictures&lt;/b&gt;&lt;br /&gt;The last thing I'd like to cover in this post is the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary.pictures(v=XNAGameStudio.40).aspx"&gt;Pictures&lt;/a&gt; property of the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary(XNAGameStudio.40).aspx"&gt;MediaLibrary&lt;/a&gt; class. This property returns a collection of &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.picture(v=XNAGameStudio.40).aspx"&gt;Picture&lt;/a&gt; instances. This class provides all the necessary meta information about the picture and streams of the image and thumbnail data.&lt;br /&gt;I use this in the sample code to create a mosaic of all Windows Phone media library pictures:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void ApplicationBarIconOpenAllButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   using(var mediaLib = new MediaLibrary())&lt;br /&gt;   {&lt;br /&gt;      // Pictures also includes saved pics, &lt;br /&gt;      // mediaLib.SavedPictures returns the same collection items&lt;br /&gt;      var allPics = mediaLib.Pictures;&lt;br /&gt;&lt;br /&gt;      // Combine the pics to a single WriteableBitmap mosaic&lt;br /&gt;      var bmp = Bitmap;&lt;br /&gt;      bmp.Clear();&lt;br /&gt;      int x = 0;&lt;br /&gt;      int y = 0;&lt;br /&gt;      foreach (var picture in allPics)&lt;br /&gt;      {&lt;br /&gt;         // Load thumbnail stream to WriteableBitmap&lt;br /&gt;         var wb = new WriteableBitmap(0, 0);&lt;br /&gt;         wb.SetSource(picture.GetThumbnail());&lt;br /&gt;&lt;br /&gt;         // Blit thumbnail to background bitmap&lt;br /&gt;         var w = wb.PixelWidth;&lt;br /&gt;         var h = wb.PixelHeight;&lt;br /&gt;         bitmap.Blit(new Rect(x, y, w, h), wb, new Rect(0, 0, w, h));&lt;br /&gt;         x += w;&lt;br /&gt;&lt;br /&gt;         // Check bounds and move to next row&lt;br /&gt;         if (x &amp;gt;= bitmap.PixelWidth)&lt;br /&gt;         {&lt;br /&gt;            x = 0;&lt;br /&gt;            y += h;&lt;br /&gt;         }&lt;br /&gt;         // Bitmap filled&lt;br /&gt;         if (y &amp;gt;= bitmap.PixelHeight)&lt;br /&gt;         {&lt;br /&gt;            break;&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   Present();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/ff434150(v=XNAGameStudio.40).aspx"&gt;GetThumbnail&lt;/a&gt; method returns the stream of an image thumbnail sized 99 x 99 pixels. This bitmap is then combined with the surface bitmap by using the&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx'&lt;/a&gt;&amp;nbsp;Blit method.&lt;br /&gt;Beside the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary.pictures(v=XNAGameStudio.40).aspx"&gt;Pictures&lt;/a&gt;&amp;nbsp;property the MediaLibrary also has the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary.savedpictures(v=XNAGameStudio.40).aspx"&gt;SavedPictures&lt;/a&gt; property, but I encountered that the SavedPictures collection returns all pictures in the emulator and not only saved pictures like the name and documentation implies.&amp;nbsp;But as a little bird told me, the SavedPictures property works as expected on a real device. &lt;br /&gt;The&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.medialibrary(XNAGameStudio.40).aspx"&gt;MediaLibrary&lt;/a&gt;&amp;nbsp;has some more members that might become&amp;nbsp;interesting&amp;nbsp;in the future, esp. when combined with the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.mediaplayer(v=XNAGameStudio.40).aspx"&gt;MediaPlayer&lt;/a&gt; class.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;This blog post covered the complete workflow of loading,&amp;nbsp;manipulating&amp;nbsp;and saving a picture to the Windows Phone's picture library / photo album. I also showed how to load all images from the library and mentioned some gotchas. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source code&lt;/b&gt;&lt;br /&gt;Download the complete Visual Studio 2010 Windows Phone solution from &lt;a href="http://dl.dropbox.com/u/2681028/Downloads/Development/SourceCode/WindowsPhone/WindowsPhoneMediaLibrarySample.zip"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-3924420352623887519?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/3924420352623887519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/07/photos-photos-photos-how-to-save-load.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3924420352623887519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/3924420352623887519'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/07/photos-photos-photos-how-to-save-load.html' title='Photos, Photos, Photos - How To Save, Load And Iterate Pictures With Windows Phone 7'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/TENBiMmCCsI/AAAAAAAAAME/lSR27CqRnDU/s72-c/medialib_Sample_Screenshot.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6662546249662452836</id><published>2010-07-05T20:03:00.006+02:00</published><updated>2010-07-22T10:54:36.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>The Ultimate Gift Card - Two Visual Studio 2010 Ultimate MSDN Subscriptions To Give Away!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TDHv4-bdwMI/AAAAAAAAAL8/jnsfD3sztsk/s1600/vs_2010_ultimate_msdn.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TDHv4-bdwMI/AAAAAAAAAL8/jnsfD3sztsk/s1600/vs_2010_ultimate_msdn.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: red;"&gt;It's over, I picked two people from the comments that deserve the MSDN&amp;nbsp;Subscription&amp;nbsp;cards the most. Thanks!&lt;/div&gt;&lt;br /&gt;I recently got three &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/subscriptionschart.aspx"&gt;Visual Studio 2010 Ultimate MSDN Subscriptions&lt;/a&gt;&amp;nbsp;cards from Microsoft. They are valid for one year, include the whole &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/subscriptionschart.aspx"&gt;Ultimate&amp;nbsp;features&lt;/a&gt;&amp;nbsp;and can be used for development and testing purposes. Ultimate &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/subscriptionschart.aspx"&gt;includes&lt;/a&gt;&amp;nbsp;Visual and Expression Studio,Windows, Office, Windows Server, SQL Server, TFS, all other server products, ... and even some &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/ee461076.aspx"&gt;Azure benefits&lt;/a&gt; are packed in. Only the support and the MSDN magazine are excluded.&lt;br /&gt;The one year Ultimate&amp;nbsp;subscription &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/buy.aspx"&gt;is worth approximately $12,000&lt;/a&gt;!&amp;nbsp;And the best thing, I have two cards left I can&amp;nbsp;give away. What a great gift from Microsoft!&lt;br /&gt;&lt;br /&gt;I want to give my two remaining cards to the Windows developer community. If you want one, just write a comment why you should get this great gift and make sure to include some form of contact information. Did I mention that these are full Ultimate subscriptions worth $12,000?&lt;br /&gt;I will prefer people who make significant contributions in the .Net open source world. Of course, your chance is even better if these contributions are for Silverlight or Windows Phone 7.&lt;br /&gt;After July 20th 2010 I'll pick two people that deserve the cards the most.&lt;br /&gt;&lt;br /&gt;Here's a photo of the package I got. Yeah, it's real! And&amp;nbsp;free, as in free beer!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/TDHwXws0E9I/AAAAAAAAAMA/-ZZwacdXn8g/s1600/vs_2010_ultimate_msdn_present_arrived.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="456" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/TDHwXws0E9I/AAAAAAAAAMA/-ZZwacdXn8g/s640/vs_2010_ultimate_msdn_present_arrived.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thanks a lot Microsoft!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6662546249662452836?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6662546249662452836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/07/ultimate-gift-card-two-visual-studio.html#comment-form' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6662546249662452836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6662546249662452836'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/07/ultimate-gift-card-two-visual-studio.html' title='The Ultimate Gift Card - Two Visual Studio 2010 Ultimate MSDN Subscriptions To Give Away!'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/TDHv4-bdwMI/AAAAAAAAAL8/jnsfD3sztsk/s72-c/vs_2010_ultimate_msdn.jpg' height='72' width='72'/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5993807111987208949</id><published>2010-06-07T19:25:00.000+02:00</published><updated>2010-06-07T19:25:10.626+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Interview'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='Website'/><title type='text'>Interview on .Net Rocks!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TAzjKjbrIqI/AAAAAAAAAL4/8Oxf-ZP_Ko0/s1600/netrocks.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TAzjKjbrIqI/AAAAAAAAAL4/8Oxf-ZP_Ko0/s1600/netrocks.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;About a month ago Richard Campbell asked me if I'd like to give an &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=564"&gt;interview about SLARToolkit&lt;/a&gt; on the .Net Rocks talk show. Of course I agreed right away.&amp;nbsp;&lt;a href="http://www.dotnetrocks.com/"&gt;.Net Rocks!&lt;/a&gt; is the largest .Net developer podcast out there and&amp;nbsp;Carl Franklin and Richard Campbell&amp;nbsp;always have great guests. It's a real&amp;nbsp;honor&amp;nbsp;for me to have been on show #564.&lt;br /&gt;We mainly talked about the Silverlight Augmented Reality Toolkit (&lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt;), but also about some of my other &lt;a href="http://www.codeplex.com/site/users/view/teichgraf"&gt;projects&lt;/a&gt; and &lt;a href="http://kodierer.blogspot.com/search/label/Coding4Fun"&gt;articles&lt;/a&gt;.&lt;br /&gt;You can download the podcast in various formats from &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=564"&gt;here&lt;/a&gt;. I hope you like it. Also make sure you subscribe to&amp;nbsp;&lt;a href="http://www.dotnetrocks.com/"&gt;.Net Rocks!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5993807111987208949?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5993807111987208949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/06/interview-on-net-rocks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5993807111987208949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5993807111987208949'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/06/interview-on-net-rocks.html' title='Interview on .Net Rocks!'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/TAzjKjbrIqI/AAAAAAAAAL4/8Oxf-ZP_Ko0/s72-c/netrocks.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5778485853560950138</id><published>2010-06-03T21:39:00.003+02:00</published><updated>2011-05-25T11:19:28.090+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Mango'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Push and Pull - Silverlight Webcam Capturing Details</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/TAgBYTnwMMI/AAAAAAAAAL0/OsNtwLlQN7Y/s1600/webcam.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/TAgBYTnwMMI/AAAAAAAAAL0/OsNtwLlQN7Y/s1600/webcam.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/mshades/2404442122/"&gt;Photo&lt;/a&gt;&amp;nbsp;(&lt;a href="http://creativecommons.org/licenses/by/2.0/deed.en"&gt;CC&lt;/a&gt;) by &amp;nbsp;&lt;a href="http://www.flickr.com/photos/mshades/"&gt;MShades&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;It's not a secret that one of my favorite Silverlight 4 features is the webcam support and I already &lt;a href="http://kodierer.blogspot.com/search/label/Webcam"&gt;played endless hours&lt;/a&gt; with it.&amp;nbsp;There are &lt;a href="http://www.bing.com/search?q=silverlight+webcam+capturesource"&gt;many blog posts out there&lt;/a&gt;&amp;nbsp;demonstrating&amp;nbsp;how to use the webcam and how to take a screenshot with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource.captureimageasync(VS.95).aspx"&gt;CaptureImageAsync&lt;/a&gt; method. Only a few cover the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.95).aspx"&gt;VideoSink&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;div&gt;This blog post will show how to use the webcam, the CaptureImageAsync method and also how to implement and use the VideoSink. But most important I'll cover what the differences between the CaptureImageAsync and VideoSink are and when to use which.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Silverlight Webcam 101&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The Silverlight 4 webcam API is pretty easy to use and just a few lines of code are needed to show a webcam video stream on screen.&lt;br /&gt;Silverlight's&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource%28VS.96%29.aspx"&gt;CaptureSource class&lt;/a&gt;&amp;nbsp;provides the webcam stream that is used as the source of a&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videobrush%28VS.95%29.aspx"&gt;VideoBrush&lt;/a&gt;, which in turn fills a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.rectangle(v=VS.95).aspx"&gt;Rectangle&lt;/a&gt;&amp;nbsp;with&amp;nbsp;the video feed from the webcam. It's also possible to use&amp;nbsp;any other &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.shape(v=VS.95).aspx"&gt;Shape&lt;/a&gt; with a Fill property.&lt;br /&gt;The&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturedeviceconfiguration%28VS.96%29.aspx"&gt;CaptureDeviceConfiguration class&lt;/a&gt;&amp;nbsp;can be used to&amp;nbsp;retrieve&amp;nbsp;a list of&amp;nbsp;all installed video and audio devices on the system. Most of the time it's sufficient to use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturedeviceconfiguration.getdefaultvideocapturedevice(v=VS.96).aspx"&gt;GetDefaultVideoCaptureDevice&lt;/a&gt;&amp;nbsp;to get the default device.&amp;nbsp;The user can specify the default video and audio devices with the Silverlight configuration; he or she only has to press the right mouse button over the Silverlight application, click "Silverlight" in the context menu and select the "Webcam / Mic" tab to set them.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S5liW9kgRBI/AAAAAAAAAKY/uaMQZ7K8zt4/s1600/SL4RC_webcam_mic_preview.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S5liW9kgRBI/AAAAAAAAAKY/uaMQZ7K8zt4/s400/SL4RC_webcam_mic_preview.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Silverlight Webcam / Mic configuration dialog.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The following C# code initializes the webcam (&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource%28VS.96%29.aspx"&gt;captureSource&lt;/a&gt;) in the Loaded event of the page and fills a rectangle (Viewport) with a VideoBrush:&lt;/div&gt;&lt;pre class="brush: c-sharp;"&gt;// Member variable (webcam reference)&lt;br /&gt;CaptureSource captureSource;&lt;br /&gt;&lt;br /&gt;private void UserControl_Loaded(object sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;   // Initialize the webcam&lt;br /&gt;   captureSource = new CaptureSource();&lt;br /&gt;   captureSource.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();&lt;br /&gt;&lt;br /&gt;   // Fill the Viewport Rectangle with the VideoBrush&lt;br /&gt;   var vidBrush = new VideoBrush();&lt;br /&gt;   vidBrush.SetSource(captureSource);&lt;br /&gt;   Viewport.Fill = vidBrush;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that the webcam is&amp;nbsp;initialized, the streaming can be started. This is done in an event handler of a Button because &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturedeviceconfiguration.requestdeviceaccess(VS.95).aspx"&gt;RequestDeviceAccess&lt;/a&gt; has to be called from an user initiated event. Otherwise it would be possible to start the webcam without the user's permission. Of course nobody wants to experience something like what &lt;a href="http://www.wired.com/threatlevel/2010/04/webcamscanda/"&gt;happened to the students with their MacBooks provided by their high school&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's the C# code:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void StartButton_Click(object sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;   // Request webcam access and start the capturing&lt;br /&gt;   if (CaptureDeviceConfiguration.RequestDeviceAccess())&lt;br /&gt;   {&lt;br /&gt;      captureSource.Start();&lt;br /&gt;   }&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will open a webcam permission dialog asking the user for the device access. This setting is consent and Silverlight can remember if the user has previously allowed that certain application. &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/TAfKABLtJiI/AAAAAAAAALw/qyEtqRdPkLk/s1600/dialog.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="152" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/TAfKABLtJiI/AAAAAAAAALw/qyEtqRdPkLk/s400/dialog.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Webcam permission dialog&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Capturing The Webcam&amp;nbsp;&lt;/b&gt;&lt;br /&gt;There are two different&amp;nbsp;approaches&amp;nbsp;to capture the webcam in Silverlight. The&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource%28VS.96%29.aspx"&gt;CaptureSource&lt;/a&gt;'s&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource.captureimageasync(VS.95).aspx"&gt;CaptureImageAsync&lt;/a&gt;&amp;nbsp;method and &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CBQQFjAA&amp;amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fsystem.windows.media.capturesource.captureimagecompleted(VS.95).aspx&amp;amp;ei=ls0HTIObMJWWOKSowdsP&amp;amp;usg=AFQjCNEQjsh-Yu7-LZ8knKFeU3ArBl8y0g"&gt;CaptureImageCompleted&lt;/a&gt; event&amp;nbsp;provide a snapshot on demand and can be considered as a pull-based technology. A custom&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.95).aspx"&gt;VideoSink&lt;/a&gt;&amp;nbsp;implementation&amp;nbsp;on the other hand&amp;nbsp;constantly&amp;nbsp;gets the raw stream from the webcam and can be considered as a push-based approach.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pull: CaptureImageAsync&amp;nbsp;Webcam Capture&lt;/b&gt;&lt;br /&gt;When the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource%28VS.96%29.aspx"&gt;CaptureSource&lt;/a&gt;'s&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource.captureimageasync(VS.95).aspx"&gt;CaptureImageAsync&lt;/a&gt;&amp;nbsp;method is called an asynchronous&amp;nbsp;capturing&amp;nbsp;task is started. After the snapshot is completed, the&amp;nbsp;&lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CBQQFjAA&amp;amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fsystem.windows.media.capturesource.captureimagecompleted(VS.95).aspx&amp;amp;ei=ls0HTIObMJWWOKSowdsP&amp;amp;usg=AFQjCNEQjsh-Yu7-LZ8knKFeU3ArBl8y0g"&gt;CaptureImageCompleted&lt;/a&gt;&amp;nbsp;event is fired. The event provides a&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap(VS.95).aspx"&gt;WriteableBitmap&lt;/a&gt;&amp;nbsp;as EventArgs.&lt;br /&gt;&lt;br /&gt;The following C# code should be added after the captureSource initialization code above:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Wiring the CaptureImageCompleted event handler&lt;br /&gt;captureSource.CaptureImageCompleted += (s, e) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;   // Do something with the camera snapshot&lt;br /&gt;   // e.Result is a WriteableBitmap&lt;br /&gt;   Process(e.Result);&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Another button is used to start the&amp;nbsp;asynchronous&amp;nbsp;capturing:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;private void SnapshotButton_Click(object sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;   // CaptureImageAsync fires the CaptureImageCompleted event&lt;br /&gt;   captureSource.ImageCaptureAsync();&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Push: VideoSink Webcam Capture&lt;/b&gt;&lt;br /&gt;The other capturing approach constantly pushes every frame from the webcam into a&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.95).aspx"&gt;VideoSink&lt;/a&gt;. The abstract&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.95).aspx"&gt;VideoSink&lt;/a&gt;&amp;nbsp;class has four methods that have to be implemented in an own subclass in order to use it.&lt;br /&gt;&lt;br /&gt;The basic set-up of a custom VideoSink looks like this:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// MyVideoSink is derived from Silverlight's VideoSink&lt;br /&gt;public class MyVideoSink : VideoSink&lt;br /&gt;{&lt;br /&gt;   VideoFormat vidFormat;&lt;br /&gt;   &lt;br /&gt;   // Could be used to initialize a container for the webcam stream data&lt;br /&gt;   protected override void OnCaptureStarted() { }&lt;br /&gt;   &lt;br /&gt;   // Could be used to dispose a container for the webcam stream data&lt;br /&gt;   // or to write a header of a video file format&lt;br /&gt;   protected override void OnCaptureStopped() { }&lt;br /&gt;&lt;br /&gt;   // Is called when the VideoFormat was changed&lt;br /&gt;   protected override void OnFormatChange(VideoFormat videoFormat)&lt;br /&gt;   {&lt;br /&gt;      this.vidFormat = videoFormat;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Is called every time the webcam provides a complete frame (Push)&lt;br /&gt;   protected override void OnSample(long sampleTime, long frameDuration, &lt;br /&gt;                                    byte[] sampleData)&lt;br /&gt;   {&lt;br /&gt;      // Process the webcam snapshot &lt;br /&gt;      // sampleData contains the raw byte stream&lt;br /&gt;      // according to the videoFormat from OnFormatChange&lt;br /&gt;      Process(sampleData, this.vidFormat);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The following C# code initializes MyVideoSink with the webcam. It should be added after the captureSource initialization code above:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Wire the VideoSink and the webcam together&lt;br /&gt;var sink = new MyVideoSink { CaptureSource = captureSource };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The VideoSink's OnCaptureStarted and OnFormatChange are raised after the captureSource.Start() method was called.&amp;nbsp;The OnSample method is constantly called as long as the webcam is activated. The actual interval&amp;nbsp;OnSample&amp;nbsp;will be called is defined in&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ee652913(v=VS.95).aspx"&gt;VideoFormat&lt;/a&gt;.&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videoformat.framespersecond(v=VS.95).aspx"&gt;FramesPerSecond&lt;/a&gt;&amp;nbsp;which is provided through the&amp;nbsp;OnFormatChange method.&amp;nbsp;The OnCaptureStopped is raised after the captureSource.Stop() method was called.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Push vs. Pull&lt;/b&gt;&lt;br /&gt;Obviously&amp;nbsp;the two approaches have different characteristics.&lt;br /&gt;&lt;br /&gt;Pull: CaptureImageAsync&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simple to use&lt;/li&gt;&lt;li&gt;Provides a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap(VS.95).aspx"&gt;WriteableBitmap&lt;/a&gt;&lt;/li&gt;&lt;li&gt;CaptureImageCompleted is raised on the UI thread (no &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.begininvoke(VS.95).aspx"&gt;Dispatcher.BeginInvoke&lt;/a&gt; necessary)&lt;/li&gt;&lt;li&gt;Only one &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.pixelformattype(v=VS.95).aspx"&gt;PixelFormat&lt;/a&gt; (ARGB32)&lt;/li&gt;&lt;li&gt;System resources aren't constantly used&lt;/li&gt;&lt;li&gt;Pull: Samples on demand&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Push: Custom VideoSink&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Direct usage of the raw byte stream&lt;/li&gt;&lt;li&gt;Less overhead&lt;/li&gt;&lt;li&gt;OnSample&amp;nbsp;is called on a background thread&lt;/li&gt;&lt;li&gt;Automatically called for every frame&lt;/li&gt;&lt;li&gt;Might support more than one &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.pixelformattype(v=VS.95).aspx"&gt;PixelFormat&amp;nbsp;in the future&lt;/a&gt;&lt;/li&gt;&lt;li&gt;More information like frame number and duration (accurate sample times)&lt;/li&gt;&lt;li&gt;Slightly faster than CaptureImageAsync if every frame is needed&lt;/li&gt;&lt;li&gt;Push: Constant sampling&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Please note that the CaptureImageAsync method can also be called periodically. Thereby it's possible to get a snapshot in a defined interval which might be faster than using a VideoSink that fires every 30 or even 60 frames per second (fps).&lt;br /&gt;&lt;br /&gt;The following C# code calls CaptureImageAsync every 100 milliseconds, which means every 10 fps a snapshot is taken:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;var dispatcherTimer = new DispatcherTimer();&lt;br /&gt;dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); // 10 fps&lt;br /&gt;dispatcherTimer.Tick += (s, e) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;   // Process camera snapshot if started&lt;br /&gt;   if (captureSource.State == CaptureState.Started)&lt;br /&gt;   {&lt;br /&gt;      // CaptureImageAsync fires the CaptureImageCompleted event&lt;br /&gt;      captureSource.CaptureImageAsync();&lt;br /&gt;   }&lt;br /&gt;};&lt;br /&gt;// Start the timer&lt;br /&gt;dispatcherTimer.Start();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Both approaches are helpful for different scenarios. The pull-based &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource.captureimageasync(VS.95).aspx"&gt;CaptureImageAsync&lt;/a&gt; method is useful for taking single snapshots, whereas a push-based custom &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.95).aspx"&gt;VideoSink&lt;/a&gt;&amp;nbsp;can be used for capturing complete sequences and encoding the webcam stream.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5778485853560950138?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5778485853560950138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/06/push-and-pull-silverlight-webcam.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5778485853560950138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5778485853560950138'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/06/push-and-pull-silverlight-webcam.html' title='Push and Pull - Silverlight Webcam Capturing Details'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/TAgBYTnwMMI/AAAAAAAAAL0/OsNtwLlQN7Y/s72-c/webcam.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7318325694366771842</id><published>2010-06-01T19:42:00.002+02:00</published><updated>2010-06-01T19:46:59.233+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Filled To The Bursting Point - WriteableBitmapEx 0.9.5.0</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TAQiadrdzxI/AAAAAAAAALo/6_wuDnCA_co/s1600/filler_demo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TAQiadrdzxI/AAAAAAAAALo/6_wuDnCA_co/s1600/filler_demo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;We're slowly getting to the first feature&amp;nbsp;complete&amp;nbsp;release of the&amp;nbsp;&lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt;&amp;nbsp;library. The last &lt;a href="http://kodierer.blogspot.com/2010/01/rounder-faster-better-writeablebitmapex.html"&gt;version (0.9.0.0) brought the&amp;nbsp;parametric curves, optimizations and other features&lt;/a&gt;. This new version 0.9.5.0 focuses on filling routines, transformations, bug fixes and more&amp;nbsp;optimizations.&lt;br /&gt;The new Fill* extension methods are equivalent&amp;nbsp;to the Draw* shape functions. The FillRectangle and FillEllipse methods use&amp;nbsp;specialized implementations to get the best performance.&amp;nbsp;FillPolygon and the other functions use a simple scanline conversion algorithm with the &lt;a href="http://en.wikipedia.org/wiki/Even-odd_rule"&gt;even-odd-rule&lt;/a&gt;. The&amp;nbsp;implemented&amp;nbsp;algorithm supports &lt;a href="http://en.wikipedia.org/wiki/Convex_and_concave_polygons"&gt;concave and convex shapes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New features&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fast FillRectangle method that uses &lt;a href="http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx"&gt;Buffer.BlockCopy&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Optimized&amp;nbsp;FillEllipse and FillEllipseCentered functions to draw a filled ellipse / circle.&lt;/li&gt;&lt;li&gt;FillPolygon, FillTriangle and FillQuad methods that use a scanline conversion algorithm.&amp;nbsp;&lt;/li&gt;&lt;li&gt;FillCurve, FillCurveClosed to draw a filled&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline"&gt;Cardinal spline&lt;/a&gt;&amp;nbsp;similar to the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;GDI&lt;/a&gt;+ API.&lt;/li&gt;&lt;li&gt;FillBeziers draws a filled&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve"&gt;Cubic Beziér spline&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Resize method with support for &lt;a href="http://en.wikipedia.org/wiki/Bilinear_interpolation"&gt;Bilinear&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation"&gt;Nearest neighbor&lt;/a&gt; interpolation.&lt;/li&gt;&lt;li&gt;Fast Crop method&amp;nbsp;to cut out a portion of the WriteableBitmap.&lt;/li&gt;&lt;li&gt;GetPixel and GetPixeli methods to get the color as&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.color%28VS.95%29.aspx"&gt;Color struct&lt;/a&gt;&amp;nbsp;at a specified x, y coordinate.&lt;/li&gt;&lt;li&gt;FromResource method to load an image from the application's resource only by passing the&amp;nbsp;relative&amp;nbsp;path without the need of the full &lt;a href="http://msdn.microsoft.com/en-us/library/aa970069.aspx"&gt;Pack URI&lt;/a&gt; syntax. Example: "Data/flower2.png" instead of "MyAssemblyName;component/Data/flower2.png".&lt;/li&gt;&lt;li&gt;Optimized Clear(Color)&amp;nbsp;method that uses&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx"&gt;Buffer.BlockCopy&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Renamed BlendMode "AlphaBlend" to "Alpha".&lt;/li&gt;&lt;li&gt;Fixed the clipping of the DrawEllipse methods. &lt;/li&gt;&lt;li&gt;Fixed some missing alpha pre-multiplications.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Other minor tweaks and bug fixes.&lt;/li&gt;&lt;li&gt;Updated the solutions to &lt;a href="http://www.microsoft.com/visualstudio/en-us/"&gt;Microsoft Visual Studio 2010&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;The code listing on the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;project's CodePlex site&lt;/a&gt; was updated to demonstrate how to use the new methods. &lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;As usual I also wrote a new sample application that shows the Fill* methods in  action. The sample starts with a real-time demo that animates the&amp;nbsp;Cardinal spline's&amp;nbsp;tension of the FillCurveClosed method, plus some&amp;nbsp;random&amp;nbsp;animated filled ellipses. The sample also contains a static page showing some of the possible filled shapes.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/WriteableBitmapEx/FillSample/WriteableBitmapExFillSampleTestPage.html" target="_blank"&gt;Open the sample in a new page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/TAQihqbhD2I/AAAAAAAAALs/uRs70YYcCMI/s1600/fill_static.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/TAQihqbhD2I/AAAAAAAAALs/uRs70YYcCMI/s640/fill_static.jpg" width="536" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Go and grab it&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt;  library is hosted at CodePlex. You can find the new binary release &lt;a href="http://writeablebitmapex.codeplex.com/releases/view/36909"&gt;here&lt;/a&gt;&amp;nbsp;and the samples in the Subversion &lt;a href="http://writeablebitmapex.codeplex.com/SourceControl/list/changesets"&gt;repository&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7318325694366771842?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7318325694366771842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/06/filled-to-bursting-point.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7318325694366771842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7318325694366771842'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/06/filled-to-bursting-point.html' title='Filled To The Bursting Point - WriteableBitmapEx 0.9.5.0'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/TAQiadrdzxI/AAAAAAAAALo/6_wuDnCA_co/s72-c/filler_demo.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6863448677947657747</id><published>2010-05-26T19:26:00.003+02:00</published><updated>2011-02-01T10:22:45.043+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding4Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='HLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Coding4Fun - Introduction to Silverlight and WPF Pixel Shaders</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S-05V9ZjpiI/AAAAAAAAALg/mwb_20VZKQs/s1600/mandrill_mosaic.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S-05V9ZjpiI/AAAAAAAAALg/mwb_20VZKQs/s1600/mandrill_mosaic.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;My &lt;a href="http://channel9.msdn.com/coding4fun/articles/SilverShader--Introduction-to-Silverlight-and-WPF-Pixel-Shaders"&gt;new article&lt;/a&gt; for&amp;nbsp;Microsoft's&amp;nbsp;&lt;a href="http://channel9.msdn.com/coding4fun"&gt;Coding4Fun site&lt;/a&gt;&amp;nbsp;is live.&amp;nbsp;It's my second article for Coding4Fun after my first&amp;nbsp;&lt;a href="http://kodierer.blogspot.com/2010/03/coding4fun-silverlight-real-time-face.html"&gt;Silverlight Face Detection&lt;/a&gt;&amp;nbsp;article.&amp;nbsp;The&amp;nbsp;&lt;a href="http://channel9.msdn.com/coding4fun/articles/SilverShader--Introduction-to-Silverlight-and-WPF-Pixel-Shaders"&gt;article&lt;/a&gt;&amp;nbsp;explains how to write &lt;a href="http://en.wikipedia.org/wiki/Pixel_shader"&gt;pixel shaders&lt;/a&gt; for Silverlight and WPF, what tools should be used, and how to work with the tools. Furthermore, it shows how to build an extensible Silverlight shader application with the help of the &lt;a href="http://en.wikipedia.org/wiki/Managed_Extensibility_Framework"&gt;Managed Extensibility Framework (MEF)&lt;/a&gt;&lt;br /&gt;The application not only comes with the two shaders that are implemented in the article, it also contains three other shaders I’ve written before. The complete source code is licensed under the &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Ms-PL&lt;/a&gt; and can be downloaded from the &lt;a href="http://silvershader.codeplex.com/"&gt;CodePlex site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6863448677947657747?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6863448677947657747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/05/coding4fun-introduction-to-silverlight.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6863448677947657747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6863448677947657747'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/05/coding4fun-introduction-to-silverlight.html' title='Coding4Fun - Introduction to Silverlight and WPF Pixel Shaders'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/S-05V9ZjpiI/AAAAAAAAALg/mwb_20VZKQs/s72-c/mandrill_mosaic.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-1058646167832449302</id><published>2010-05-17T20:29:00.001+02:00</published><updated>2010-05-17T20:30:41.277+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>SLARToolkit Beginner's Guide</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/S-_gFWwnxNI/AAAAAAAAALk/fwwL2reJLf0/s1600/SLAR_1-2-3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/S-_gFWwnxNI/AAAAAAAAALk/fwwL2reJLf0/s1600/SLAR_1-2-3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Since I &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;released SLARToolkit&lt;/a&gt; I often get similar, basic questions. This is a sign that the SLARToolkit&amp;nbsp;documentation&amp;nbsp;and the samples might be too complex for a beginner.&amp;nbsp;That's why I wrote an easy step by step &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Beginner's%20Guide"&gt;Beginner's Guide&lt;/a&gt;&amp;nbsp;which hopefully closes the gap. The&amp;nbsp;tutorial&amp;nbsp;shows how to build the simplest Silverlight Augmented Reality application possible.&lt;br /&gt;&lt;br /&gt;The guide is part of the &lt;a href="http://slartoolkit.codeplex.com/documentation"&gt;SLARToolkit documentation at CodePlex&lt;/a&gt;. Please read the&amp;nbsp;&lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Beginner's%20Guide"&gt;Beginner's Guide here&lt;/a&gt;&amp;nbsp;and let me know your feedback so I can improve it further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-1058646167832449302?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/1058646167832449302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/05/slartoolkit-beginners-guide.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1058646167832449302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1058646167832449302'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/05/slartoolkit-beginners-guide.html' title='SLARToolkit Beginner&apos;s Guide'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/S-_gFWwnxNI/AAAAAAAAALk/fwwL2reJLf0/s72-c/SLAR_1-2-3.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7234826894638424471</id><published>2010-04-15T23:02:00.005+02:00</published><updated>2010-04-15T23:09:44.402+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Silverlight 4 Up and Running</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S8dyhm7VAII/AAAAAAAAALY/XGL51_kYWF4/s1600/SL4times.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S8dyhm7VAII/AAAAAAAAALY/XGL51_kYWF4/s1600/SL4times.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Woohoo! The final Silverlight 4 runtime and the developer tools for Visual Studio 2010 were released today and exactly three years ago the name Silverlight was officially introduced. A lot of &lt;a href="http://10rem.net/blog/2010/04/15/silverlight-4-release-happy-third-birthday-silverlight"&gt;great things happened in the Silverlight world&lt;/a&gt; since then and we now have a superb &lt;a href="http://en.wikipedia.org/wiki/Rich_Internet_application"&gt;RIA&lt;/a&gt; platform at hand.&lt;br /&gt;&lt;br /&gt;To get started with the Silverlight 4 development you only need &lt;a href="http://www.microsoft.com/visualstudio/en-us/products"&gt;Visual Studio 2010&lt;/a&gt; and the &lt;a href="http://www.silverlight.net/getstarted/"&gt;Silverlight 4 Tools for Visual Studio&lt;/a&gt;. Don't forget, it's all free with the &lt;a href="http://www.microsoft.com/express/downloads/"&gt;Visual Studio 2010 Express edition&lt;/a&gt;! The end-user runtime is available for &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkID=149156"&gt;Windows&lt;/a&gt; and &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkId=107365"&gt;Mac&lt;/a&gt;. As usual, Tim Heuer &lt;a href="http://timheuer.com/blog/archive/2010/04/15/download-silverlight-4-released.aspx"&gt;wrote a nice blog post&lt;/a&gt; about the Silverlight tools.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Past &lt;/b&gt;&lt;br /&gt;The APIs haven't changed much since the last release candidate (RC) and exactly one month ago I wrote &lt;a href="http://kodierer.blogspot.com/2010/03/silverlight-4-release-candidate.html"&gt;a summary of all the new features&lt;/a&gt; that were added since the  Silverlight 4 Beta to the Silverlight 4 RC and the breaking changes. The post also contained some details about the  CaptureSource's changed capture usage pattern. So if you used the Silverlight 4 Beta and skipped the RC, &lt;a href="http://kodierer.blogspot.com/2010/03/silverlight-4-release-candidate.html"&gt;this post&lt;/a&gt; might be helpful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Present&lt;/b&gt;&lt;br /&gt;I installed the Visual Studio 2010 RTM build on Monday after it was released at &lt;a href="http://www.devconnections.com/"&gt;Devconnections&lt;/a&gt;, the final Silverlight 4 Tools for Visual Studio today and recompiled all my Silverlight 4 samples and open source projects. It all worked like a charm and even on this machine were I had several betas of all the tools installed before. Kudos to the Visual Studio and the Silverlight team for making such great products.&lt;br /&gt;My relevant &lt;a href="http://kodierer.blogspot.com/search/label/Silverlight%204"&gt;Silverlight 4 blog posts&lt;/a&gt;, the &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt; and the &lt;a href="http://facelight.codeplex.com/"&gt;FaceLight&lt;/a&gt; CodePlex open source projects are now up to date.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Future&lt;/b&gt;&lt;br /&gt;The first beta of the next Silverlight version will most certainly see the light this year. Make sure to vote or suggest new features at the &lt;a href="http://silverlight.mswish.net/" target="_blank"&gt;silverlight.mswish.net&lt;/a&gt; site. The most important feature suggestion for me is the &lt;a href="http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions/suggestions/311034-full-gpu-accelerated-3d-engine-direct3d-opengl-"&gt;GPU accelerated 3D support&lt;/a&gt; that I suggested a while ago and which was consolidated into &lt;a href="http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions/suggestions/310787-3d-support"&gt;this suggestion&lt;/a&gt;. If you agree with me, you should &lt;a href="http://dotnet.uservoice.com/forums/4325-silverlight-feature-suggestions/suggestions/310787-3d-support"&gt;vote for it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Have fun with Silverlight 4!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7234826894638424471?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7234826894638424471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/04/silverlight-4-up-and-running.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7234826894638424471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7234826894638424471'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/04/silverlight-4-up-and-running.html' title='Silverlight 4 Up and Running'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/S8dyhm7VAII/AAAAAAAAALY/XGL51_kYWF4/s72-c/SL4times.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7426004500588692671</id><published>2010-04-01T21:38:00.002+02:00</published><updated>2010-04-02T00:12:24.835+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Microsoft Silverlight MVP Award</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/S7Tu7-l5tRI/AAAAAAAAALM/ft4vJutEVow/s1600-h/Microsoft_MVP_logo_2_5577C288.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/S7Tu7-l5tRI/AAAAAAAAALM/ft4vJutEVow/s1600/Microsoft_MVP_logo_2_5577C288.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Today, I got an exiting Email from Microsoft: &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Congratulations! We are pleased to present you with the 2010 Microsoft® MVP Award! This award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others. We appreciate your outstanding contributions in Silverlight technical communities during the past year.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I hope it wasn't an April Fools' joke. ;-)&lt;br /&gt;&lt;br /&gt;It's a real honor for me to get the Silverlight &lt;a href="http://mvp.support.microsoft.com/gp/aboutmvp"&gt;MVP award&lt;/a&gt;. All the &lt;a href="http://twitter.com/John_Papa/silverlightmvp"&gt;Silverlight MVPs&lt;/a&gt; I know are truly outstanding and I can hardly believe I'm considered to be one of them now. It's even more surreal that I'm  the first Silverlight MVP from Germany and the second from the &lt;a href="http://en.wikipedia.org/wiki/DACH"&gt;DACH region&lt;/a&gt; after the excellent &lt;a href="http://www.galasoft.ch/"&gt;Laurent Bugnion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I would like to thank Microsoft, the great Silverlight community and especially all that nominated me for the MVP award. It's needless to say that I will continue my work with Silverlight to provide more useful content and I hope I'll be able to satisfy the high expectations.&lt;br /&gt;&lt;br /&gt;Thank you all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7426004500588692671?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7426004500588692671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/04/microsoft-silverlight-mvp-award.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7426004500588692671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7426004500588692671'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/04/microsoft-silverlight-mvp-award.html' title='Microsoft Silverlight MVP Award'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/S7Tu7-l5tRI/AAAAAAAAALM/ft4vJutEVow/s72-c/Microsoft_MVP_logo_2_5577C288.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-8905772780965591984</id><published>2010-03-25T20:53:00.006+01:00</published><updated>2011-02-01T10:19:14.421+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding4Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Coding4Fun - Silverlight Real Time Face Detection</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S6s5bD04DoI/AAAAAAAAAK8/LCZejFziL3Y/s1600/FaceLight192x96.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S6s5bD04DoI/AAAAAAAAAK8/LCZejFziL3Y/s320/FaceLight192x96.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A while ago &lt;a href="http://www.betterthaneveryone.com/"&gt;Clint Rutkas&lt;/a&gt; (yes, the guy that built the awesome &lt;a href="http://www.engadget.com/2010/03/19/windows-phone-7-series-used-to-control-t-shirt-cannon-redefine/"&gt;MIX T-Shirt cannon&lt;/a&gt;) asked me if I could write an article for Microsoft's &lt;a href="http://channel9.msdn.com/coding4fun"&gt;Coding4Fun site&lt;/a&gt;. I felt honored and of course I agreed. Today I'm proud to announce that my first &lt;a href="http://channel9.msdn.com/coding4fun/articles/FaceLight--Silverlight-4-Real-Time-Face-Detection"&gt;Coding4Fun article was published&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The article demonstrates how to implement a simple facial recognition system using Silverlight 4’s new webcam feature. The method I've implemented searches for a certain sized skin color region in a webcam snapshot. This technique is not as perfect as a professional computer vision library like &lt;a href="http://en.wikipedia.org/wiki/OpenCV"&gt;OpenCV&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Haar-like_features"&gt;Haar-like features&lt;/a&gt; they use, but it runs in real time and works for most webcam scenarios.&lt;br /&gt;&lt;br /&gt;The complete source code for the &lt;a href="http://channel9.msdn.com/coding4fun/articles/FaceLight--Silverlight-4-Real-Time-Face-Detection"&gt;article&lt;/a&gt; is &lt;a href="http://facelight.codeplex.com/"&gt;available at CodePlex&lt;/a&gt; and licensed under the &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Ms-PL&lt;/a&gt;.&lt;br /&gt;If you like the &lt;a href="http://channel9.msdn.com/coding4fun/articles/FaceLight--Silverlight-4-Real-Time-Face-Detection"&gt;article&lt;/a&gt;, I’ll write a follow-up that might cover a more stable (better) segmentation approach, how to optimize the performance further and more.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 04-06-2010&lt;/b&gt;&lt;br /&gt;The article was translated into Russian and is &lt;a href="http://blogs.msdn.com/rucoding4fun/archive/2010/04/02/facelight-silverlight-4.aspx"&gt;available at the Russian Coding 4 Fun site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 04-15-2010&lt;/b&gt;&lt;br /&gt;Updated the application to the final Silverlight 4 RTW build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-8905772780965591984?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/8905772780965591984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/03/coding4fun-silverlight-real-time-face.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8905772780965591984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8905772780965591984'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/03/coding4fun-silverlight-real-time-face.html' title='Coding4Fun - Silverlight Real Time Face Detection'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/S6s5bD04DoI/AAAAAAAAAK8/LCZejFziL3Y/s72-c/FaceLight192x96.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-365321408381743430</id><published>2010-03-17T21:02:00.066+01:00</published><updated>2010-07-19T20:00:37.864+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Wp7Dev'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Let it ring - WriteableBitmapEx for Windows Phone</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S6ErNnt5SSI/AAAAAAAAAKc/g8GOwyC_mSE/s1600-h/winphone_sample.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S6ErNnt5SSI/AAAAAAAAAKc/g8GOwyC_mSE/s1600/winphone_sample.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;Actually I never heard a Windows Phone prototype ringing yet, but that's not the point of this blog post.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;On Monday, March 15, 2010 Microsoft not only &lt;a href="http://kodierer.blogspot.com/2010/03/silverlight-4-release-candidate.html"&gt;released the Silverlight 4 Release Candidate&lt;/a&gt; at MIX, they also made the first CTP of the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=185584"&gt;Windows Phone Developer Tools&lt;/a&gt; available. The best news is, Silverlight is THE technology for &lt;a href="http://www.silverlight.net/getstarted/devices/windows-phone/"&gt;Windows Phone 7 series development&lt;/a&gt; and the SDK doesn't cost $ 100, no, it's completely free!&lt;br /&gt;&amp;nbsp;Of course I downloaded and installed the CTP right away and played around with it. First I was a bit disappointed after I realized that &lt;a href="http://msdn.microsoft.com/en-us/library/ff426930%28VS.96%29.aspx"&gt;custom pixel shaders are not supported&lt;/a&gt; (at the moment) and, correct me if I'm wrong, real time camera access is not built in either, which is essential for a nice &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt; Windows Phone version. BUT, it's only the first CTP and at least we have the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt; at hand for some procedural graphics fun.&lt;br /&gt;&lt;br /&gt;A while ago I started the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx project&lt;/a&gt; to make the life a bit easier when working with the WriteableBitmap. And now what would be more natural than porting it to the Windows Phone platform.&lt;br /&gt;So I fired up Visual Studio 2010 for Windows Phone and set up the first real Windows Phone Silverlight project pretty quickly. After I included the original WriteableBitmapEx source code files I started the build. And it just worked, without any errors. Wow, that was an easy port.&lt;br /&gt;Sure, Scott Guthrie mentioned in his keynote that the Windows Phone fully supports Silverlight, but there are actually some &lt;a href="http://msdn.microsoft.com/en-us/library/ff426930%28VS.96%29.aspx"&gt;differences to the desktop version&lt;/a&gt;. Nevertheless the first developer experience was just impressive and WriteableBitmapEx for Windows Phone is actually just another build target and not a real port of the original Silverlight library.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sample&lt;/b&gt;&lt;br /&gt;Unfortunately the current CTP is a bit slow when it comes to real time graphics, but there is hope and the&lt;a href="http://go.microsoft.com/fwlink/?LinkID=185269"&gt; Release Notes&lt;/a&gt; say:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"Per frame callbacks (i.e. handling the CompositionTarget.Rendering event) should be used sparingly in this release due to less than optimal performance."&lt;/i&gt;&lt;/blockquote&gt;That's why I used the interactive parts of the latest &lt;a href="http://kodierer.blogspot.com/2010/01/rounder-faster-better-writeablebitmapex.html"&gt;WriteableBitmapEx curve sample&lt;/a&gt; to make a Windows Phone sample. All this was done in less than hour and most of the time was spent to arrange the controls and play with the great Windows Phone emulator.&lt;br /&gt;Below is a video that shows the demo running in the emulator. Please note how the phone's back button is used to remove the last control point from the list.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="287" width="560"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10220024&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10220024&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="560" height="287"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Background music is &lt;a href="http://www.mosaik.se/music/minutes"&gt;Loell&lt;/a&gt; by &lt;a href="http://www.mosaik.se/"&gt;mosaik&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;br /&gt;As I mentioned above parts of the code from the latest &lt;a href="http://kodierer.blogspot.com/2010/01/rounder-faster-better-writeablebitmapex.html"&gt;WriteableBitmapEx  curve sample&lt;/a&gt; were simply re-used. Furthermore I rearranged the controls for the phone's landscape mode.&lt;br /&gt;The functionality of the phone's back button is implemented by adding an event handler to the Page's &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.page.backkeypress%28VS.92%29.aspx"&gt;BackKeyPress event&lt;/a&gt;. The used event handler:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;void PhoneApplicationPage_BackKeyPress(object sender, CancelEventArgs e)&lt;br /&gt;{&lt;br /&gt;    // Remove last control point from the list&lt;br /&gt;    if (points != null &amp;amp;&amp;amp; points.Count &amp;gt; 0)&lt;br /&gt;    {&lt;br /&gt;        points.RemoveAt(points.Count - 1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Refresh image&lt;br /&gt;    Draw();&lt;br /&gt;&lt;br /&gt;    // Back is handled here. Prevent that the phone returns to the home screen&lt;br /&gt;    e.Cancel = true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Source code&lt;/b&gt;&lt;br /&gt;From now on you will find a Visual Studio solution and a project file for the Windows Phone version in the &lt;a href="http://writeablebitmapex.codeplex.com/SourceControl/list/changesets"&gt;WriteableBitmapEx' source code repository&lt;/a&gt;. Starting with the next release I will also provide a ready to use Windows Phone build.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Woo Hoo!&lt;/b&gt;&lt;br /&gt;Silverlight is becoming more and more a full multi platform technology and all Silverlight developers are now Windows Phone developers too. It's an exciting time to be a .Net developer. Awesome!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 03-18-2010&lt;/b&gt;&lt;br /&gt;I changed the size of the control points to the appropriate minimum  touch target size as required in the &lt;a href="http://go.microsoft.com/?linkid=9713252"&gt;Windows Phone UI guidelines&lt;/a&gt;. According to it the minimum touch target size has to be 9 mm / 34 pixel and the visual size 60-100% of the touch target size.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S6J5uWf1xcI/AAAAAAAAAKg/yY1GYyQu2mA/s1600-h/winphone_sample_fixed_ui.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="322" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S6J5uWf1xcI/AAAAAAAAAKg/yY1GYyQu2mA/s640/winphone_sample_fixed_ui.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-365321408381743430?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/365321408381743430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/03/let-it-ring-writeablebitmapex-for.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/365321408381743430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/365321408381743430'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/03/let-it-ring-writeablebitmapex-for.html' title='Let it ring - WriteableBitmapEx for Windows Phone'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/S6ErNnt5SSI/AAAAAAAAAKc/g8GOwyC_mSE/s72-c/winphone_sample.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-2887038217830855477</id><published>2010-03-15T19:33:00.007+01:00</published><updated>2010-03-16T16:28:02.420+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>The Silverlight 4 Release Candidate</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S5lMim57NpI/AAAAAAAAAKU/BaaZMHiX0i0/s1600-h/Mix10_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S5lMim57NpI/AAAAAAAAAKU/BaaZMHiX0i0/s1600/Mix10_logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scott Guthrie&lt;/a&gt; et al. announced many awesome new things during the keynotes at Microsoft's &lt;a href="http://live.visitmix.com/"&gt;MIX10 conference&lt;/a&gt;. One of it was the Silverlight 4 Release Candidate which replaces the beta version and is now &lt;a href="http://silverlight.net/getstarted/silverlight-4"&gt;available for download&lt;/a&gt;. Beside all the great new features that were added, it's now finally possible to use the &lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;Visual  Studio 2010 RC&lt;/a&gt; for &lt;a href="http://go.microsoft.com/fwlink/?LinkID=141284"&gt;Silverlight 4 development&lt;/a&gt;. Kudos to the Silverlight team for catching up with Visual Studio 2010 and&amp;nbsp;all the cool new features they implemented.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The final Silverlight 4 RTW version will be available next month (April 2010). Additonaly the first CTP of the Winows Phone SDK was released and Silverlight is THE platform for &lt;a href="http://www.silverlight.net/getstarted/devices/windows-phone/"&gt;Windows Phone 7 series development&lt;/a&gt; and it's free! Silverlight for Symbian is also &lt;a href="http://www.silverlight.net/getstarted/devices/symbian/"&gt;now available&lt;/a&gt; for Nokia S60 5th Edition devices like the N97. So Silverlight is becoming more and more a full multi platform technology. Awesome!&lt;br /&gt;&lt;br /&gt;This blog post focuses on the Silverlight 4 RC and contains a summary of all the new features that were added since the Silverlight 4 Beta to the Silverlight 4 RC and the breaking changes that naturally come along with betas. Plus some details about the CaptureSource's new capture usage pattern.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New Silverlight 4 RC features&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Rich Text&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RichTextBox rename&lt;/li&gt;&lt;li&gt;Text position and selection APIs&lt;/li&gt;&lt;li&gt;XAML property for serializing text content&lt;/li&gt;&lt;li&gt;XAML clipboard format&lt;/li&gt;&lt;li&gt;FlowDirection support on Runs&lt;/li&gt;&lt;li&gt;"Format then type" support&lt;/li&gt;&lt;li&gt;Thai / Vietnamese / Indic support&lt;/li&gt;&lt;li&gt;UI Automation Text pattern&lt;/li&gt;&lt;/ul&gt;Networking&lt;br /&gt;&lt;ul&gt;&lt;li&gt;UploadProgress support (Client stack)&lt;/li&gt;&lt;li&gt;Caching support (Client stack)&lt;/li&gt;&lt;li&gt;Sockets security restrictions removal (Full Trust)&lt;/li&gt;&lt;li&gt;Sockets policy file retrieval via HTTP&lt;/li&gt;&lt;li&gt;Accept-Language header&lt;/li&gt;&lt;/ul&gt;Out of Browser (Full Trust)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XAP signing&lt;/li&gt;&lt;li&gt;Silent install and emulation mode&lt;/li&gt;&lt;li&gt;Custom window chrome&lt;/li&gt;&lt;li&gt;Better support for COM Automation&lt;/li&gt;&lt;li&gt;Cancelable shutdown event&lt;/li&gt;&lt;li&gt;Updated security dialogs&lt;/li&gt;&lt;/ul&gt;Media&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pinned full-screen mode on secondary display&lt;/li&gt;&lt;li&gt;Webcam / Mic configuration preview&lt;/li&gt;&lt;li&gt;More descriptive MediaSourceStream errors&lt;/li&gt;&lt;li&gt;Content &amp;amp; Output protection updates&lt;/li&gt;&lt;li&gt;Updates to H.264 content protection (ClearNAL)&lt;/li&gt;&lt;li&gt;Digital Constraint Token&lt;/li&gt;&lt;li&gt;CGMS-A&lt;/li&gt;&lt;li&gt;Multicast&lt;/li&gt;&lt;li&gt;Graphics card driver validation &amp;amp; revocation&lt;/li&gt;&lt;/ul&gt;Graphics and Printing&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hardware accelerated perspective transformations&lt;/li&gt;&lt;li&gt;Ability to query page size and printable area&lt;/li&gt;&lt;li&gt;Memory usage and performance improvements&lt;/li&gt;&lt;/ul&gt;Data&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Entity-level validation support of INotifyDataErrorInfo for DataGrid&lt;/li&gt;&lt;li&gt;XPath support for XML&lt;/li&gt;&lt;/ul&gt;Parser&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New architecture enables future innovation&lt;/li&gt;&lt;li&gt;Performance and stability improvements&lt;/li&gt;&lt;li&gt;XmlnsPrefix &amp;amp; XmlnsDefinition attributes&lt;/li&gt;&lt;li&gt;Support setting order-dependent properties&lt;/li&gt;&lt;/ul&gt;Globalization &amp;amp; Localization&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for 31 new languages&lt;/li&gt;&lt;li&gt;Arabic, Hebrew and Thai input on Mac&lt;/li&gt;&lt;li&gt;Indic support&lt;/li&gt;&lt;/ul&gt;More&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Update to DeepZoom code base with hardware acceleration&lt;/li&gt;&lt;li&gt;Support for Private mode browsing&lt;/li&gt;&lt;li&gt;Google Chrome support (Windows)&lt;/li&gt;&lt;li&gt;FrameworkElement.Unloaded event&lt;/li&gt;&lt;li&gt;HTML Hosting accessibility&lt;/li&gt;&lt;li&gt;IsoStore performance improvements&lt;/li&gt;&lt;li&gt;Native hosting performance improvements (e.g. Bing Toolbar)&lt;/li&gt;&lt;li&gt;Consistency with Silverlight for Mobile APIs and Tooling&lt;/li&gt;&lt;li&gt;System.Numerics.dll&lt;/li&gt;&lt;li&gt;Dynamic XAP support (MEF)&lt;/li&gt;&lt;li&gt;Frame / Navigation refresh support&lt;/li&gt;&lt;/ul&gt;The new webcam and microphone configuration preview is pretty neat. The user can now select the default webcam &amp;amp; microphone device really comfortable and we only need to use CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice() or CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice() to get the selected default video and audio device.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S5liW9kgRBI/AAAAAAAAAKY/uaMQZ7K8zt4/s1600-h/SL4RC_webcam_mic_preview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S5liW9kgRBI/AAAAAAAAAKY/uaMQZ7K8zt4/s400/SL4RC_webcam_mic_preview.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The webcam permission dialog is now consent and can remember if the user has previously allowed that certain application. &lt;a href="http://timheuer.com/blog/archive/2010/03/15/whats-new-in-silverlight-4-rc-mix10.aspx"&gt;Tim Heuer's blog post&lt;/a&gt; has more details about this handy new feature.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Breaking Changes since the Silverlight 4 beta&lt;/b&gt;&lt;br /&gt;The first and most important take away: As usual all Silverlight 4 beta applications have to be updated to the RC and recompiled, otherwise the new RC runtime won't execute them.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Renamed RichTextArea to RichTextBox&lt;/li&gt;&lt;li&gt;Changes to DRM API&lt;/li&gt;&lt;li&gt;TextSelection.SetPropertyValue is now named .ApplyPropertyValue&lt;/li&gt;&lt;li&gt;INotifyDataErrorInfo moved to core (System.Windows.dll)&lt;/li&gt;&lt;li&gt;WebBrowser.ScriptNotify signature change&lt;/li&gt;&lt;li&gt;NotificationWindow.Visible and NotificationWindow.Closed were changed&lt;/li&gt;&lt;li&gt;Webcam and output protection change&lt;/li&gt;&lt;li&gt;COM Interop API changes (name and namespace)&lt;/li&gt;&lt;li&gt;RichTextBox.TextWrapping default value changed&lt;/li&gt;&lt;li&gt;Binding declarations in XAML where the target is a DependencyObject&lt;/li&gt;&lt;li&gt;HtmlBrush renamed to WebBrowserBrush&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The official &lt;a href="http://msdn.microsoft.com/en-us/library/cc645049%28VS.96%29.aspx"&gt;breaking changes document&lt;/a&gt; contains all the details and Koen Zwikstra (&lt;a href="http://twitter.com/kozw"&gt;@kozw&lt;/a&gt;) has made some &lt;a href="http://firstfloorsoftware.com/blog/the-silverlight-definitive-diff-lists/"&gt;useful diff lists&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Changed usage pattern for AsyncCaptureImage&lt;/b&gt;&lt;br /&gt;The biggest difference in the webcam API besides the renaming of some enums, properties and other members is the change of the AsyncCaptureImage method which was renamed to CaptureImageAsync. Additionally the usage pattern of the CaptureImageAsync method was updated to the standard .Net / Silverlight asynchronous event pattern.&lt;br /&gt;&lt;br /&gt;Before the Silverlight 4 RC, AsyncCaptureImage was used like this:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Initialization&lt;br /&gt;captureSource = new CaptureSource();&lt;br /&gt;captureSource.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();&lt;br /&gt;&lt;br /&gt;// Capture image&lt;br /&gt;captureSource.AsyncCaptureImage(bitmap =&gt;&lt;br /&gt;{&lt;br /&gt;   // Process camera snapshot&lt;br /&gt;   Process(bitmap);&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The new RC CaptureImageAsync usage pattern:&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Initialization&lt;br /&gt;captureSource = new CaptureSource();&lt;br /&gt;captureSource.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();&lt;br /&gt;// Wiring the CaptureImageCompleted event handler&lt;br /&gt;captureSource.CaptureImageCompleted += (s, e) =&gt;&lt;br /&gt;{&lt;br /&gt;   // Process camera snapshot (e.Result is a WriteableBitmap)&lt;br /&gt;   Process(e.Result);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// CaptureImageAsync fires the CaptureImageCompleted event&lt;br /&gt;captureSource.ImageCaptureAsync();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Although the pre-RC pattern was smaller and easier, it's overall more consistent now and I welcome the changes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Blog.SL4++&lt;/b&gt;&lt;br /&gt;I already updated &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit&lt;/a&gt; and the samples and I will continue to update some of my Silverlight 4 beta samples during the next days. Furthermore I will make a Silverlight 4 RC build of the &lt;a href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx&lt;/a&gt; sample that should take advantage of the new hardware accelerated perspective transformations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-2887038217830855477?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/2887038217830855477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/03/silverlight-4-release-candidate.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2887038217830855477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2887038217830855477'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/03/silverlight-4-release-candidate.html' title='The Silverlight 4 Release Candidate'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/S5lMim57NpI/AAAAAAAAAKU/BaaZMHiX0i0/s72-c/Mix10_logo.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6903863381990871408</id><published>2010-03-10T20:33:00.003+01:00</published><updated>2010-03-10T20:35:19.406+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='Website'/><title type='text'>Poll Results: Do you block Google Analytics tracking in your browser?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S5fw3dpywFI/AAAAAAAAAKM/gC4K4jrMX4A/s1600-h/TwtPoll_GoogleAnalytics_Blocking_192x192.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S5fw3dpywFI/AAAAAAAAAKM/gC4K4jrMX4A/s1600/TwtPoll_GoogleAnalytics_Blocking_192x192.png" /&gt;&lt;/a&gt;&lt;/div&gt;I recently encountered a large difference between the Google Analytics statistics of my &lt;a href="http://rene-schulte.info/"&gt;website&lt;/a&gt; and the server logs. This raised the question in me how reliable the Google Analytics data really is and I asked you to take part in a small survey: &lt;a href="http://kodierer.blogspot.com/2010/01/do-you-block-google-analytics-tracking.html"&gt;Do you block Google Analytics tracking in your browser?&lt;/a&gt;. The poll is closed now and here are the results.&lt;br /&gt;&lt;br /&gt;The poll got 267 votes total and 68 people voted "Yes, I block Google Analytics." 199 voted for "No, I don't block Google Analytics." This means 25.47% of the participants block Google Analytics in their browser.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;You can now use a simple formula to get the real world Google Analytics statistics (at least for my visitors - the best of all). :-)&lt;br /&gt;&lt;br /&gt;GAreal = GAreport * 1.25468164794007490636704119850187&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Big thanks to all that helped me and took part in the survey!&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/S5fxnL7DV-I/AAAAAAAAAKQ/Y2F00as2peE/s1600-h/TwtPoll_GoogleAnalytics_Blocking.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/S5fxnL7DV-I/AAAAAAAAAKQ/Y2F00as2peE/s640/TwtPoll_GoogleAnalytics_Blocking.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6903863381990871408?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6903863381990871408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/03/poll-results-do-you-block-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6903863381990871408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6903863381990871408'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/03/poll-results-do-you-block-google.html' title='Poll Results: Do you block Google Analytics tracking in your browser?'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/S5fw3dpywFI/AAAAAAAAAKM/gC4K4jrMX4A/s72-c/TwtPoll_GoogleAnalytics_Blocking_192x192.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-5956495758567327249</id><published>2010-02-24T21:05:00.009+01:00</published><updated>2010-05-16T13:32:32.867+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>SLARToolkit - Silverlight Augmented Reality Toolkit</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S4Qi3FHxvEI/AAAAAAAAAKA/USNJpAY5pCs/s1600-h/SLARToolkit_Sample_Textbox.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S4Qi3FHxvEI/AAAAAAAAAKA/USNJpAY5pCs/s1600/SLARToolkit_Sample_Textbox.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;In my &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-preannouncement.html"&gt;last blog post&lt;/a&gt; I've preannounced SLARToolkit: The open source Silverlight Augmented Reality Toolkit. Today I'm proud to announce that SLARToolkit is now &lt;a href="http://slartoolkit.codeplex.com/"&gt;available at CodePlex&lt;/a&gt;.&lt;br /&gt;The aim of SLARToolkit is to make &lt;a href="http://en.wikipedia.org/wiki/Augmented_reality"&gt;Augmented Reality&lt;/a&gt; with Silverlight as easy as possible so that everyone will be able to make Silverlight Augmented Reality applications. Therefore the SLARToolkit release not only includes the full &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt; sample you might know from &lt;a href="http://kodierer.blogspot.com/2009/12/world-real-time-3d-augmented-reality.html"&gt;this blog post&lt;/a&gt;, it also comes with a brand new sample that uses Silverlight's 3D projection capabilities through my &lt;a href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx library&lt;/a&gt; to project different UIElements on the marker.&lt;br /&gt;&lt;br /&gt;The SLARToolkit project description from the &lt;a href="http://slartoolkit.codeplex.com/"&gt;CodePlex site&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;SLARToolkit is a flexible Augmented Reality library for Silverlight with  the aim to make real time &lt;a class="externalLink" href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt;  applications with Silverlight as easy and fast as possible. It can be  used with Silverlight's Webcam API or with any other CaptureSource  or a WriteableBitmap. SLARTookit is based on the established &lt;a class="externalLink" href="http://nyatla.jp/nyartoolkit"&gt;NyARToolkit&lt;/a&gt; and &lt;a class="externalLink" href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;. SLARToolkit uses a dual license  model and could be used for open or closed source applications under  certain conditions. See the &lt;a href="http://slartoolkit.codeplex.com/license"&gt;License page&lt;/a&gt; for details.&lt;/i&gt; &lt;/blockquote&gt;Features: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Direct Support for Silverlight's &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource%28VS.96%29.aspx"&gt;CaptureSource&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Flexible through a generic &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt;  &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Marker%20Detectors&amp;amp;referringTitle=Home"&gt;detector&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Multiple marker detection&lt;/li&gt;&lt;li&gt;Simple black square &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=markers&amp;amp;referringTitle=Home"&gt;markers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Custom &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=markers&amp;amp;referringTitle=Home"&gt;markers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Real time performance&lt;/li&gt;&lt;li&gt;Easy to use&lt;/li&gt;&lt;li&gt;&lt;a href="http://slartoolkit.codeplex.com/documentation?referringTitle=Home"&gt;Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Based on established algorithms and techniques&lt;/li&gt;&lt;li&gt;Uses the &lt;a class="externalLink" href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;  library&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;A webcam and at least the Silverlight 4 runtime must be installed to run  the sample. It's available for &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkID=149156"&gt;Windows&lt;/a&gt; and &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkId=107365"&gt;Mac&lt;/a&gt;. Alternatively there is also a new video of the Silverlight projection sample embedded below.&lt;br /&gt;If you want to try it yourself you need do download the &lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_SLAR_16x16segments_80width.pdf"&gt;SLAR&lt;/a&gt; and  / or &lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_L_16x16segments_80width.pdf"&gt;L&lt;/a&gt; marker, print them and hold them in front of the camera. The marker(s) should be  printed non-scaled at the original size (80 x 80 mm) and centered for a  small white border. Also make sure the camera is set up properly and the scene is illuminated well without hard shadows. See the SLARToolkit &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Markers&amp;amp;referringTitle=Home"&gt;Markers&lt;/a&gt;  documentation for more details.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Samples/SLARToolKitSample/TestPage.html"&gt;Open the sample in a new page.&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/S4QrY3PAx_I/AAAAAAAAAKE/OEHVuaQg0Mk/s1600-h/SLARToolkit_Sample_Screenshot_Video.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/S4QrY3PAx_I/AAAAAAAAAKE/OEHVuaQg0Mk/s640/SLARToolkit_Sample_Screenshot_Video.jpg" width="635" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Simply press the "Start Fun" Button to start the webcam. Use the ComboBox to select a  different UIElement that will be mapped on the marker. The size and the orientation can be changed with the "Scale" and "Rotation" Sliders. The "Threshold" Slider controls the threshold for the marker detection. The "Flip x-axis" Checkbox could be used to flip  the video (the webcam output is mirror-reversed by default).&lt;br /&gt;If you click the "Start Fun" Button for the first time you need to give  your permission for the capturing. This application uses the default Silverlight capture device. You can specify the video and audio devices that are used by default with the Silverlight Configuration. Just press  the right mouse button over the application, click "Silverlight" in the  context menu and select the "Webcam / Mic" tab to set them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Video&lt;/b&gt;&lt;br /&gt;I've recorded a short video of the new sample with &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Expression_Encoder"&gt;Expression  Encoder&lt;/a&gt;'s Screen Capture feature. Please keep in mind that the screen recording software eats up a lot of resources while recording and that the actual frame rate is way better.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object width="560" height="539"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9713000&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9713000&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="560" height="539"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Background music is &lt;a href="http://softphase.org/netlabel/releases/sfp08"&gt;leandi&lt;/a&gt; by &lt;a href="http://www.mosaik.se/"&gt;mosaik&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;br /&gt;This sample uses the SLARToolkit &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Marker%20Detectors&amp;amp;referringTitle=Documentation"&gt;CaptureSourceMarkerDetector&lt;/a&gt; to detect the markers in each webcam frame. The detection result contains a transformation matrix for each found marker which is then used to transform the selected UIElement. The tracked marker region is highlighted with a red quad through the &lt;a href="http://WriteableBitmapEx.codeplex.com"&gt;WriteableBitmapEx library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download it, build your app and augment your reality&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600-h/SLARToolKit_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S4QyAZcMegI/AAAAAAAAAKI/T8kjtsi6pMU/s1600/SLARToolKit_logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;The open source &lt;a href="http://slartoolkit.codeplex.com/"&gt;SLARToolkit library and the samples are hosted at CodePlex&lt;/a&gt;. If you have any comments, questions or  suggestions don't hesitate and write a comment, use the &lt;a href="http://slartoolkit.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt;  on the CodePlex site or contact me &lt;a href="http://flavors.me/rschu"&gt;via any other media&lt;/a&gt;.&lt;br /&gt;Have fun with the library and please keep me updated if you use it anywhere so I can put a link on the project site.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 03-15-2010&lt;/b&gt;&lt;br /&gt;Updated to the Silverlight 4 Release Candidate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 04-15-2010&lt;/b&gt;&lt;br /&gt;Updated to the final Silverlight 4 RTW build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-5956495758567327249?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/5956495758567327249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html#comment-form' title='35 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5956495758567327249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/5956495758567327249'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html' title='SLARToolkit - Silverlight Augmented Reality Toolkit'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/S4Qi3FHxvEI/AAAAAAAAAKA/USNJpAY5pCs/s72-c/SLARToolkit_Sample_Textbox.jpg' height='72' width='72'/><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-4427043106083901648</id><published>2010-02-15T20:41:00.013+01:00</published><updated>2010-03-16T15:48:20.281+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>SLARToolkit Preannouncement</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/S3mg53YqCuI/AAAAAAAAAJ4/EkRVvhKuAzc/s1600-h/slartookit_mstechdays.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/S3mg53YqCuI/AAAAAAAAAJ4/EkRVvhKuAzc/s1600/slartookit_mstechdays.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: red;"&gt;SLARToolkit has been released. Please read &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;this blog post&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;In my &lt;a href="http://kodierer.blogspot.com/2010/01/rounder-faster-better-writeablebitmapex.html"&gt;latest blog posts&lt;/a&gt;, the comments and on &lt;a href="http://twitter.com/rschu"&gt;Twitter&lt;/a&gt; I hinted at on one of the projects I'm currently working on: SLARToolkit - The Silverlight Augmented Reality Toolkit. My aim for SLARToolkit is to make &lt;a href="http://en.wikipedia.org/wiki/Augmented_reality"&gt;Augmented Reality&lt;/a&gt; with Silverlight as easy as possible, fast and open source. With this everyone will be able to make Silverlight Augmented Reality applications like &lt;a href="http://kodierer.blogspot.com/2009/12/world-real-time-3d-augmented-reality.html"&gt;that one&lt;/a&gt;. SLARToolkit is based on &lt;a href="http://nyatla.jp/nyartoolkit"&gt;NyARToolkit&lt;/a&gt; which is a extented port of the famous &lt;a href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;. I'm almost done with the implementation and in contact with ARToolworks, which are holding the license for ARToolkit, to get a license agreement. I hope I'll be able to release SLARToolkit within the next two or three weeks at CodePlex. Please stay tuned.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Two weeks ago Julien Dollon contacted me and asked if I could help him with an Augmented Reality demo for his Silverlight 4 talk at &lt;a href="http://www.microsoft.com/france/mstechDays/"&gt;Microsoft TechDays 2010&lt;/a&gt; in Paris. Since I'm a nice guy, I've built a special SLARToolkit version for him and send it along with the source code of the SLARToolkit Silverlight projection sample. The sample uses my &lt;a href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx library&lt;/a&gt; to project UIElements on the markers. Actually the Matrix3DEx library has its roots there.&lt;br /&gt;Julien altered the sample a bit and showed it at MS TechDays 2010 during his Silverlight 4 talk last week. The presentation was recorded and the official video is available, but you can also watch Julien's self recorded video of the session. The SLARToolkit demo starts at 39:02.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;object height="394" width="700"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9381724&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9381724&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="512" height="288"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And the official screen cast:&lt;br /&gt;&lt;iframe frameborder="no" height="480" scrolling="no" src="http://www.microsoft.com/france/vision/mstechdays10/Webcast-iframe.aspx?EID=3717c113-3c2f-4a4a-93b1-ca0692683e6c" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-4427043106083901648?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/4427043106083901648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/02/slartoolkit-preannouncement.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4427043106083901648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/4427043106083901648'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/02/slartoolkit-preannouncement.html' title='SLARToolkit Preannouncement'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/S3mg53YqCuI/AAAAAAAAAJ4/EkRVvhKuAzc/s72-c/slartookit_mstechdays.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6872582831996095533</id><published>2010-01-28T19:08:00.004+01:00</published><updated>2010-03-20T13:50:38.176+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Rounder, Faster, Better - WriteableBitmapEx 0.9.0.0</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S2CXkhQ7ygI/AAAAAAAAAJg/a07j8MGhRGM/s1600-h/plant.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S2CXkhQ7ygI/AAAAAAAAAJg/a07j8MGhRGM/s1600/plant.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A lot of things happened since the &lt;a href="http://writeablebitmapex.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37915"&gt;release&lt;/a&gt; of the last &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt; version. I used the time I have to wait for a third party &lt;span style="font-size: x-small;"&gt;[spoiler] until I could release my Silverlight Augmented Reality framework SLARToolkit [/spoiler]&lt;/span&gt; to work on the WriteableBitmapEx project. Beside some optimizations and smaller extensions, the main addition in the new version is the support for parametric curves. I implemented the cubic &lt;a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve"&gt;Beziér spline&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/en-us/library/ms536358%28VS.85%29.aspx"&gt;Cardinal spline&lt;/a&gt;. The Cardinal spline is not part of Silverlight's and WPF's &lt;a href="http://msdn.microsoft.com/en-us/library/cc189068%28VS.95%29.aspx"&gt;Geometry&lt;/a&gt; nor shape classes, but the &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawcurve.aspx"&gt;DrawCurve method&lt;/a&gt; is part of &lt;a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;GDI&lt;/a&gt;+ and many people appreciate the characteristics of cardinal splines. Fortunately the WriteableBitmapEx library fills this gap now for the WriteableBitmap.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;New features&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Draw methods for parametric curves: &lt;a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve"&gt;Cubic Beziér splines&lt;/a&gt;  and the &lt;a href="http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline"&gt;Cardinal  splines&lt;/a&gt; similar to the &lt;a href="http://en.wikipedia.org/wiki/Graphics_Device_Interface"&gt;GDI&lt;/a&gt;+ API.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Clone method to copy the whole WriteableBitmap to a new instance. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Boundary check for the Draw* (Shape) methods. The coordinates are now clipped to the WriteableBitmap's size. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;A new, even faster DrawLine method overload that uses the  bitmap's pixels int array, width and height directly as parameters. This method should be used if many lines are drawn to the same WriteableBitmap.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Optimization of the byte array conversion methods using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx"&gt;Buffer.BlockCopy&lt;/a&gt;  method. This improvement was suggested in &lt;a href="http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html?showComment=1264576269353#c8999343237063463181"&gt;this  comment&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;WriteTga method to write a  WriteableBitmap as a &lt;a class="externalLink" href="http://en.wikipedia.org/wiki/Truevision_TGA"&gt;TGA image&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to a stream. The original method was provided in &lt;a href="http://nokola.com/blog/post/2010/01/21/Quick-and-Dirty-Output-of-WriteableBitmap-as-TGA-Image.aspx"&gt;this blog post&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Fast path for Blitting using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx"&gt;Buffer.BlockCopy&lt;/a&gt; method if the BlendMode is None and the bitmap should not be tinted. The result is a performance boost by factor 3.5 compared to traditional loop iteration. This improvement was suggested in &lt;a href="http://writeablebitmapex.codeplex.com/Thread/View.aspx?ThreadId=80375"&gt;this CodePlex discussion&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Adam Kinney contributed two new blend modes for the Blit method: Multiply and Mask. He used these in his &lt;a href="http://adamkinney.wordpress.com/2010/01/09/image-blitting-in-silverlight-with-writeablebitmapex/"&gt;cool torn photo effect&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;A new method that takes a function as parameter and iterates over each pixel and sets its color. The method is called ForEach and has two overloads. Usage example: &lt;br /&gt;writeableBmp.ForEach((x, y, color) =&gt; Color.FromArgb(color.A, color.R / 2, (byte)(x * y), 100));&lt;br /&gt;The method was suggested in &lt;a href="http://writeablebitmapex.codeplex.com/Thread/View.aspx?ThreadId=80151"&gt;this  CodePlex discussion&lt;/a&gt;.&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;The code listing on the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;project's CodePlex site&lt;/a&gt; was updated to show the usage of the new methods. &lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;I also wrote a new sample application that shows the spline methods in  action. The sample starts with a demo animation that uses the Cardinal spline DrawCurve method to draw an artificial plant that grows procedurally. The other part of the sample is interactive and allows to draw and manipulate Beziér and Cardinal splines with the mouse.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/WriteableBitmapEx/CurveSample/WriteableBitmapExCurveSampleTestPage.html" target="_blank"&gt;Open the sample in a new page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S2GAVXfhZqI/AAAAAAAAAJs/o7sFuc3M3-I/s1600-h/WBX_spline.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S2GAVXfhZqI/AAAAAAAAAJs/o7sFuc3M3-I/s640/WBX_spline.jpg" width="548" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Uncheck the "Growing plant demo" Checkbox to change to the interactive mode where you can add new or move curve control points with the left mouse button. Press the DEL key while a control point is selected to remove it.  The used curve type can be changed with the Radio Buttons. A cardinal spline needs at least 3 points and a cubic Beziér 4 points, a start point, the control point 1, the control point 2 and the end point.The Slider controls the tension of the Cardinal spline. The tension defines the shape of the curve and is usually between 0 and 1. A value of 0 would be a straight line.&lt;br /&gt;Uncheck the "Points" Checkbox to hide the control points and press the Clear Button to remove all control points. Click the Save Button to write the WriteableBitmap to a TGA image file.&lt;br /&gt;The other controls should be self-explaining.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get it while it's hot&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt;  library is hosted at CodePlex. You can find the new binary release &lt;a href="http://writeablebitmapex.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36908"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6872582831996095533?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6872582831996095533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/01/rounder-faster-better-writeablebitmapex.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6872582831996095533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6872582831996095533'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/01/rounder-faster-better-writeablebitmapex.html' title='Rounder, Faster, Better - WriteableBitmapEx 0.9.0.0'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/S2CXkhQ7ygI/AAAAAAAAAJg/a07j8MGhRGM/s72-c/plant.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6934585787301861388</id><published>2010-01-25T20:30:00.019+01:00</published><updated>2010-03-10T20:36:38.312+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='Website'/><title type='text'>Do you block Google Analytics tracking in your browser?</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S1hWXO5tVSI/AAAAAAAAAJc/461GaK_yzbA/s1600-h/ga.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S1hWXO5tVSI/AAAAAAAAAJc/461GaK_yzbA/s1600/ga.jpg" /&gt;&lt;/a&gt;Recently I checked the server logs for my website and compared the statistics with the &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; data for the timespan. I expected that the page views and visits won't be the same, but I haven't expected such a large difference I encountered.&lt;br /&gt;Just to make it clear, I don't use Google Analytics for evil, I'm not Google and I'm not interested in advertising or web marketing, I'm just curious what my visitors (you) are looking for and what caught the interest, so I can provide more content in this field.&lt;br /&gt;I know some people that block Analytics tracking in their browser because of the Google octopus, or disabled Java Script at all. &lt;br /&gt;&lt;br /&gt;The difference between the Google Analytics statistics and the server logs raised the question in me how reliable the Google Analytics data is when several people block it in their browser. I started to search for some block statistics, but couldn't find any useful information and I also think the actual blocking-rate does crucially depend on the website's audience and used technology. That's why I created a little poll at &lt;a href="http://twtpoll.com/0noyx6/1"&gt;twtpoll.com&lt;/a&gt; and asked my Twitter friends to vote. Big thanks to all that already voted, but not all of you are on Twitter, so I like to ask here too:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twtpoll.com/0noyx6"&gt;Do you block Google Analytics tracking in your browser?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will publish the results here on my blog after the poll is over on Feb 28, 2010. Thanks for taking your time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 03-10-2010&lt;/b&gt;&lt;br /&gt;The results are now &lt;a href="http://kodierer.blogspot.com/2010/03/poll-results-do-you-block-google.html"&gt;available&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6934585787301861388?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6934585787301861388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/01/do-you-block-google-analytics-tracking.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6934585787301861388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6934585787301861388'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/01/do-you-block-google-analytics-tracking.html' title='Do you block Google Analytics tracking in your browser?'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/S1hWXO5tVSI/AAAAAAAAAJc/461GaK_yzbA/s72-c/ga.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-1920119346152159343</id><published>2010-01-18T20:13:00.179+01:00</published><updated>2010-02-23T19:33:59.071+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Matrix3DEx'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Matrix3DEx 1.0 - When PlaneProjection is not enough</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/S1StpTpDYdI/AAAAAAAAAJQ/oBt5vpGxnac/s1600-h/screenshot.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/S1StpTpDYdI/AAAAAAAAAJQ/oBt5vpGxnac/s1600/screenshot.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;A new year has begun and I started a new open source project at &lt;a href="http://matrix3dex.codeplex.com/"&gt;CodePlex&lt;/a&gt;. It's called &lt;a href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx&lt;/a&gt; and is an extension library for the Silverlight &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.matrix3d%28VS.95%29.aspx"&gt;Matrix3D struct&lt;/a&gt;. Most of the functionality I implemented in Matrix3DEx was originally required for another open source project I'm currently working on &lt;i&gt;(hint, hint),&lt;/i&gt; and as you might know I also &lt;a href="http://kodierer.blogspot.com/2009/12/writeablebitmapex-writeablebitmap.html"&gt;like to extend&lt;/a&gt; Silverlight's graphics functionality in a reusable manner. That's why I decided to extract the Matrix3D code into a separate open source project, add some more useful methods, document it and write a sample.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx&lt;/a&gt; project description from the CodePlex site:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;The Matrix3DEx library is a collection of extension and factory methods for Silverlight's &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.matrix3d%28VS.95%29.aspx"&gt;Matrix3D struct&lt;/a&gt;. The Matrix3D struct represents a 4x4 matrix that is used in combination with the &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.matrix3dprojection%28VS.95%29.aspx"&gt;Matrix3DProjection&lt;/a&gt; to apply more complex semi-3D scenarios to any UIElement than are possible with the simple &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.planeprojection%28VS.95%29.aspx"&gt;PlaneProjection&lt;/a&gt;. This makes it possible to apply arbitrary model transformation matrices and perspective matrices to Silverlight elements.&lt;br /&gt;The Matrix3D struct is very minimalistic and has only a few &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.matrix3d_members%28VS.95%29.aspx"&gt;members&lt;/a&gt;. The Matrix3DEx library tries to compensate that with extension and factory methods for common transformation matrices that are easy to use like built in methods.&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;Features:&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Factory methods&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Translation, scaling and rotation around x, y, z or any defined axis&lt;/li&gt;&lt;li&gt;Perspective field of view and orthographic projection&lt;/li&gt;&lt;li&gt;Camera (look-at) with position, target and up vector&lt;/li&gt;&lt;li&gt;Support for left-handed and right-handed coordination systems&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Extension methods &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Calculation of the matrix' determinant&lt;/li&gt;&lt;li&gt;Matrix transpose&lt;/li&gt;&lt;li&gt;SwapHandedness to change from right-handed to left-handed coordination system and vice versa&lt;/li&gt;&lt;li&gt;Dump of the values row by row into a formatted string &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Math helper methods&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Angle conversion from degrees to radians and vice versa&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;Some use cases where Silverlight's semi-3D projection is needed can be implemented with the PlaneProjection, but there are also some scenarios where the PlaneProjection wouldn't work or only with a lot of effort. One example is the usage of a physics library that returns a matrix for an object. Traditional matrix transformations are an elegant alternative for such cases and the Matrix3DEx library has factory and extension methods for all the common matrices.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/Matrix3DEx/Sample/Matrix3DExSampleTestPage.html" target="_blank"&gt;Open the sample&lt;/a&gt; in a new page.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S1SyUzrCkgI/AAAAAAAAAJU/ClfOzz5pmrQ/s1600-h/sample_screenshot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S1SyUzrCkgI/AAAAAAAAAJU/ClfOzz5pmrQ/s400/sample_screenshot.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The application loads a bunch of photos asynchronously and randomizes the position vector of each. The sample uses most of the Matrix3DEx features and has some Sliders and CheckBoxes to change the parameters. Uncheck the "Animate" CheckBox to disable the camera movement and click on an Image to select it. The translation, scaling and the rotation matrices of the selected element can be changed with the corresponding Sliders. You can move the camera, change the target and the "Field Of View" with the other Sliders or fix the camera target at the selected element.&lt;br /&gt;The basic functionality of the sample might also be done with the PlaneProjection, but a separate look-at matrix (camera) simplifies the code a lot and makes it easier to read. Other things like a custom &lt;a href="http://en.wikipedia.org/wiki/Angle_of_view"&gt;field of view&lt;/a&gt; are not possible with the PlaneProjection.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How it works &lt;/b&gt;&lt;br /&gt;The sample uses a DipatcherTimer to call the Update method every 100 milliseconds.&lt;br /&gt;The core of the Update method: &lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Create global transformations&lt;br /&gt;var vw = Viewport.Width;&lt;br /&gt;var vh = Viewport.Height;&lt;br /&gt;var invertYAxis = Matrix3DFactory.CreateScale(1, -1, 1);&lt;br /&gt;var translate   = Matrix3DFactory.CreateTranslation(TranslateX, &lt;br /&gt;                                                    TranslateY,&lt;br /&gt;                                                    TranslateZ);         &lt;br /&gt;var rotateX     = Matrix3DFactory.CreateRotationX(MathHelper.ToRadians(RotateX));&lt;br /&gt;var rotateY     = Matrix3DFactory.CreateRotationY(MathHelper.ToRadians(RotateY));&lt;br /&gt;var rotateZ     = Matrix3DFactory.CreateRotationZ(MathHelper.ToRadians(RotateZ));&lt;br /&gt;var scale       = Matrix3DFactory.CreateScale(ScaleX, ScaleY, ScaleZ);&lt;br /&gt;var lookAt      = Matrix3DFactory.CreateLookAtLH(CameraX, CameraY, CameraZ,&lt;br /&gt;                                                 CameraLookAtX, &lt;br /&gt;                                                 CameraLookAtY, &lt;br /&gt;                                                 CameraLookAtZ);&lt;br /&gt;var viewport    = Matrix3DFactory.CreateViewportTransformation(vw, vh);&lt;br /&gt;var fieldOfView = MathHelper.ToRadians(FieldOfView);&lt;br /&gt;var projection  = Matrix3DFactory.CreatePerspectiveFieldOfViewLH(fieldOfView, &lt;br /&gt;                                                                 vw / vh,&lt;br /&gt;                                                                 NearPlane,&lt;br /&gt;                                                                 FarPlane);&lt;br /&gt;&lt;br /&gt;// Transform all elements&lt;br /&gt;var selectedMatrix = Matrix3D.Identity;&lt;br /&gt;foreach (var elem in this.Elements)&lt;br /&gt;{&lt;br /&gt;   // The UIElement&lt;br /&gt;   var e = elem.Element;&lt;br /&gt;&lt;br /&gt;   // Create transformation matrices for UIElement&lt;br /&gt;   var centerAtOrigin = Matrix3DFactory.CreateTranslation(-e.ActualWidth * 0.5,&lt;br /&gt;                                                          -e.ActualHeight * 0.5, &lt;br /&gt;                                                          0);&lt;br /&gt;   var baseTranslate = Matrix3DFactory.CreateTranslation(elem.PositionX, &lt;br /&gt;                                                         elem.PositionY,&lt;br /&gt;                                                         elem.PositionZ);&lt;br /&gt;&lt;br /&gt;   // Combine the transformation matrices&lt;br /&gt;   var m = Matrix3D.Identity;&lt;br /&gt;   m = m * centerAtOrigin;&lt;br /&gt;   m = m * invertYAxis;&lt;br /&gt;&lt;br /&gt;   // Apply addtional world transformations to the seleced element&lt;br /&gt;   if (elem == SelectedElement)&lt;br /&gt;   {&lt;br /&gt;      m = m * scale;&lt;br /&gt;      m = m * rotateX * rotateY * rotateZ;&lt;br /&gt;      m = m * translate;&lt;br /&gt;&lt;br /&gt;      // Should the camera target be fixed at the selected element?&lt;br /&gt;      if (ChkLookAtSelected.IsChecked.Value)&lt;br /&gt;      {&lt;br /&gt;         lookAt = Matrix3DFactory.CreateLookAtLH(CameraX, CameraY, CameraZ, &lt;br /&gt;                                                 elem.PositionX, &lt;br /&gt;                                                 elem.PositionY, &lt;br /&gt;                                                 elem.PositionZ);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Calculate the final view projection matrix&lt;br /&gt;   m = m * baseTranslate;&lt;br /&gt;   m = Matrix3DFactory.CreateViewportProjection(m, lookAt, projection, viewport);&lt;br /&gt;&lt;br /&gt;   // Apply the matrix to the UIElement&lt;br /&gt;   e.Projection = new Matrix3DProjection { ProjectionMatrix = m };&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;First the global transformation matrices like camera projection are created using the &lt;a href="http://en.wikipedia.org/wiki/Cartesian_coordinate_system#Orientation_and_handedness"&gt;left-handed&lt;/a&gt; Matrix3DEx factory methods. After that the element local transformations are calculated and the final matrix is applied to the UIElement's &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.projection%28VS.95%29.aspx"&gt;Projection property&lt;/a&gt;.&lt;br /&gt;See the &lt;a href="http://matrix3dex.codeplex.com/"&gt;project site&lt;/a&gt; for another simplified code listing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Go and grab it&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/S1TGYwM4J0I/AAAAAAAAAJY/MTi5euyZiBg/s1600-h/m3x_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/S1TGYwM4J0I/AAAAAAAAAJY/MTi5euyZiBg/s1600/m3x_logo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;The open source &lt;a href="http://matrix3dex.codeplex.com/"&gt;Matrix3DEx&lt;/a&gt; library is hosted at CodePlex and released under the &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Microsoft Public License&lt;/a&gt; (Ms-PL) license. If you have any comments, questions or suggestions don't hesitate and write a comment, use the &lt;a href="http://matrix3dex.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on the CodePlex site or contact me via any other media.&lt;br /&gt;Have fun with the library and let me know if it was useful for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-1920119346152159343?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/1920119346152159343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/01/matrix3dex-10-when-planeprojection-is.html#comment-form' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1920119346152159343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1920119346152159343'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/01/matrix3dex-10-when-planeprojection-is.html' title='Matrix3DEx 1.0 - When PlaneProjection is not enough'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/S1StpTpDYdI/AAAAAAAAAJQ/oBt5vpGxnac/s72-c/screenshot.jpg' height='72' width='72'/><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-7393269048089508856</id><published>2010-01-10T20:12:00.002+01:00</published><updated>2010-01-12T23:36:44.516+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Goodbye GPL</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/S0nDfQFObdI/AAAAAAAAAJI/kjYYhaaqYho/s1600-h/no_gpl.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/S0nDfQFObdI/AAAAAAAAAJI/kjYYhaaqYho/s1600/no_gpl.png" /&gt;&lt;/a&gt;&lt;/div&gt;In the past I've released the source code that mostly comes along with my blog posts under the &lt;a href="http://www.opensource.org/licenses/gpl-3.0.html"&gt;GPLv3&lt;/a&gt; license to ensure that changes on the code always stay open and never get closed. But the GPL has a major drawback, it's too &lt;a href="http://en.wikipedia.org/wiki/Viral_license"&gt;viral&lt;/a&gt;, which means if someone uses GPL licensed code the new code has to be released under the GPL too. And if someone uses this new code, the new code 2 has to be put under the GPL again and so on. And as the &lt;a href="http://en.wikipedia.org/wiki/Free_Software_Foundation"&gt;FSF&lt;/a&gt; &lt;a href="http://www.fsf.org/licensing/licenses/gpl-faq.html"&gt;states&lt;/a&gt; this even applies when the code is just linked dynamically with a GPL'ed library only except if it uses the &lt;a href="http://en.wikipedia.org/wiki/GPL_linking_exception"&gt;GPL linking exception&lt;/a&gt;. That's why I wanted to move away from the GPL and searched for some alternatives. Finally I decided to use the &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Ms-PL&lt;/a&gt; license from now on if my work doesn't depend on GPL infected code. I've chosen the Ms-PL because it's approved by the &lt;a href="http://www.opensource.org/"&gt;OSI&lt;/a&gt;, it's short and easy understandable, the &lt;a href="http://en.wikipedia.org/wiki/Copyleft#Strong_and_weak_copyleft"&gt;weak copyleft&lt;/a&gt; guarantees that changes on the original code have to be committed back and that it stays open and it could be used for commercial products. Jon Galloway (&lt;a href="http://twitter.com/jongalloway"&gt;@jongalloway&lt;/a&gt;) summarized it nicely in &lt;a href="http://twitter.com/jongalloway/statuses/7568999564"&gt;his Twitter reply to me&lt;/a&gt;: "Ms-PL is essentially &lt;a href="http://www.opensource.org/licenses/bsd-license.php"&gt;BSD&lt;/a&gt; + patent protection." So the Ms-PL is suitable, short, simple and keeps the trolls away. &lt;br /&gt;&lt;br /&gt;I have changed all the source code headers and License.txt files and updated the Zip files with the source code you find linked on most blog posts. If you still find a GPL reference, just ignore it and if the Ms-PL is a problem for you, just contact me and I might put the relevant code under a second license.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-7393269048089508856?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/7393269048089508856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2010/01/goodbye-gpl.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7393269048089508856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/7393269048089508856'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2010/01/goodbye-gpl.html' title='Goodbye GPL'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/S0nDfQFObdI/AAAAAAAAAJI/kjYYhaaqYho/s72-c/no_gpl.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-6720745934832163492</id><published>2009-12-30T19:17:00.008+01:00</published><updated>2010-05-16T13:32:01.531+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='HLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Ye Olde Kamera - Silverlight 4 Webcam &amp; Old Movie Shader</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/SztD_MKcCdI/AAAAAAAAAJE/oz1x7KTQ-b4/s1600-h/greets.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/SztD_MKcCdI/AAAAAAAAAJE/oz1x7KTQ-b4/s1600/greets.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;Another great and successful year comes to an end and I hope that the next year will get even better. We all don't get younger and we change over the years, but the last Silverlight demo I made for this year allows you take some fake aged memories with your webcam. The Silverlight 4 &lt;a href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#webcam"&gt;webcam and microphone support&lt;/a&gt; is always fun and even more when it's combined with a &lt;a href="http://en.wikipedia.org/wiki/Pixel_shader"&gt;pixel shader&lt;/a&gt;. This demo uses my &lt;a href="http://kodierer.blogspot.com/2009/08/ye-olde-pixels-silverlight-3-old-movie.html"&gt;Old Movie Pixel Shader&lt;/a&gt; to create a neat real time webcam effect that simulates scratches, noise and other effects you might have seen in old movies. I also brushed things up a bit by framing the video output with a filmstrip and using some nice new icons from &lt;a href="http://www.eggheadcafe.com/free-commercial-icons-graphics/free-icon-graphics-list.aspx"&gt;eggheadcafe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;The Silverlight 4 runtime must be installed to run the demo. It's available for &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkID=149156"&gt;Windows&lt;/a&gt; and &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkId=107365"&gt;Mac&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/2681028/BlogData/OldCam/TestPage.html" target="_blank"&gt;Open the sample in a new page&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/S6TKRc7Iq9I/AAAAAAAAAKs/X0awcIz7p1o/s1600-h/oldcam.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/S6TKRc7Iq9I/AAAAAAAAAKs/X0awcIz7p1o/s400/oldcam.jpg" width="330" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The Webcam capturing could be started and stopped with the camera Button. If you press it for the first time you need to give your permission for the capturing. This application uses the default Silverlight capture device. You can specify the video and audio devices that are used by default with the Silverlight Configuration. Just press the right mouse button over the application, click "Silverlight" in the context menu and select the new "Webcam / Mic" tab to set them.&lt;br /&gt;Press the disk Button to take a framed snapshot and save it to a JPEG file on your harddisk.&lt;br /&gt;The amount of noise can be changed using the Slider and the movie ToggleButton allows you to disable the Old Movie Shader.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;br /&gt;It's basically the Silverlight 4 &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource%28VS.96%29.aspx"&gt;CaptureSource&lt;/a&gt; class and my Old Movie Pixel Shader attached to the video output. I covered the Silverlight webcam and shader usage in &lt;a href="http://kodierer.blogspot.com/2009/11/edgecam-silverlight-4-webcam-edge.html"&gt;this blog post&lt;/a&gt; and the JPEG encoding in this &lt;a href="http://kodierer.blogspot.com/2009/11/edgecam-shots-saving-silverlight-4.html"&gt;one&lt;/a&gt;. The Old Movie Shader was presented &lt;a href="http://kodierer.blogspot.com/2009/08/ye-olde-pixels-silverlight-3-old-movie.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source code&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;Visual Studio 2010&lt;/a&gt; solution including the &lt;a href="http://kodierer.blogspot.com/2009/08/ye-olde-pixels-silverlight-3-old-movie.html"&gt;refactored&lt;/a&gt; Old Movie Shader is available &lt;a href="http://dl.dropbox.com/u/2681028/Downloads/Development/SourceCode/OldCam.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Final words&lt;/b&gt;&lt;br /&gt;Thanks to my kids and especially to my wife for all her patience in 2009. I love her!&lt;br /&gt;I also like to thank all the people and new friends I got to know this year and especially the Silverlight community. I hope you liked my blog posts and enjoyed the Silverlight demos I've made. I have more to come next year.&lt;br /&gt;I wish you all a great new year, all the best in 2010 and peace!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 03-20-2010&lt;/b&gt;&lt;br /&gt;Updated to the Silverlight 4 release candidate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 04-15-2010&lt;/b&gt;&lt;br /&gt;Updated to the final Silverlight 4 RTW build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-6720745934832163492?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/6720745934832163492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2009/12/ye-olde-kamera-silverlight-4-webcam-old.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6720745934832163492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/6720745934832163492'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2009/12/ye-olde-kamera-silverlight-4-webcam-old.html' title='Ye Olde Kamera - Silverlight 4 Webcam &amp; Old Movie Shader'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/SztD_MKcCdI/AAAAAAAAAJE/oz1x7KTQ-b4/s72-c/greets.jpeg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-1935849426223852550</id><published>2009-12-17T23:48:00.020+01:00</published><updated>2010-05-16T13:31:47.126+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='SLARToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>World# - Real Time 3D Augmented Reality with Silverlight</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/Syqv5_vG3XI/AAAAAAAAAJA/VsAWwAN2t1I/s1600-h/SLARToolkitSample.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/Syqv5_vG3XI/AAAAAAAAAJA/VsAWwAN2t1I/s1600/SLARToolkitSample.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: red;"&gt;Please read the Update at the end of this post.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;a href="http://kodierer.blogspot.com/2009/12/silverlight-4-augmented-reality-proof.html"&gt;Silverlight 4 Augmented Reality Proof Of Concept&lt;/a&gt; blog post I proved that it's possible to implement &lt;a href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt; applications with Silverlight 4 and the built-in &lt;a href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#webcam"&gt;webcam API&lt;/a&gt;. The &lt;a href="http://kodierer.blogspot.com/2009/12/silverlight-4-augmented-reality-proof.html"&gt;proof of concept&lt;/a&gt; used an image showing a Silverlight logo that was attached to the tracked marker. With this blog post I'm back in this field, but this time with real 3D Augmented Reality in Silverlight!&lt;br /&gt;I use the open source Augmented Reality library &lt;a href="http://nyatla.jp/nyartoolkit/wiki/index.php?NyARToolkitCS.en"&gt;NyARToolkitCS&lt;/a&gt; again and implemented the necessary interfaces to make it work with Silverlight. The &lt;a href="http://nyatla.jp/nyartoolkit/wiki/index.php?NyARToolkitCS.en"&gt;NyARToolkitCS&lt;/a&gt; library is a completely managed version of the well known &lt;a href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;. I also use the open source managed game engine &lt;a href="http://balder.codeplex.com/"&gt;Balder&lt;/a&gt; for the rendering of 3D models that augment the reality. Balder is mainly developed by the Silverlight MVP &lt;a href="http://www.ingebrigtsen.info/"&gt;Einar Ingebrigtsen&lt;/a&gt;. He is working hard on his 3D game engine and provided quick fixes for some issues I encountered while using Balder and I also had a nice chat with him, so big shout out to Einar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;A webcam and at least the Silverlight 4 runtime must be installed to run  the sample. To view the application you need to install the Silverlight 4 runtime. It's available for &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkID=149156"&gt;Windows&lt;/a&gt; and &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkId=107365"&gt;Mac&lt;/a&gt;. You can also watch a video below.&lt;br /&gt;If you want to try it yourself you need do download the &lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_SLAR_16x16segments_80width.pdf"&gt;SLAR&lt;/a&gt; and  / or &lt;a class="externalLink" href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Marker/Marker_L_16x16segments_80width.pdf"&gt;L&lt;/a&gt; marker, print them and hold them in front of the camera. The marker(s) should be  printed non-scaled at the original size (80 x 80 mm) and centered for a  small white border. Also make sure the camera is set up properly and the scene is illuminated well without hard shadows. See the SLARToolkit &lt;a href="http://slartoolkit.codeplex.com/wikipage?title=Markers&amp;amp;referringTitle=Home"&gt;Markers&lt;/a&gt;  documentation for more details.&lt;br /&gt;&lt;br /&gt;Try it out &lt;a href="http://dl.dropbox.com/u/2681028/CodeplexData/SLARToolkit/Samples/SLARToolKitBalderSample/TestPage.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Simply press the "Start Fun" Button, hold the printed &lt;a href="http://dl.dropbox.com/u/2681028/BlogData/SLARToolkit/pattHiro.pdf"&gt;marker&lt;/a&gt; in front of the camera and move it around. Use the ComboBox to select a different 3D model. The "Flip x-axis" Checkbox could be used to flip the video (the webcam output is mirror-reversed by default).&lt;br /&gt;If you click the "Start Fun" Button for the first time you need to give your permission for the capturing. This application uses the default Silverlight capture device. You can specify the video and audio devices that are used by default with the Silverlight Configuration. Just press the right mouse button over the application, click "Silverlight" in the context menu and select the "Webcam / Mic" tab to set them.&lt;br /&gt;The Car model was made by Psionic, the Tank model by &lt;a href="http://www.katsbits.com/htm/models/kt_ww2-tanks-vehicles.htm"&gt;Ken Beyer&lt;/a&gt;. The Teapot is from the Balder samples and I guess it was made by &lt;a href="http://www.ingebrigtsen.info/"&gt;Einar Ingebrigtsen&lt;/a&gt;. The rest was made by myself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Video&lt;/b&gt;&lt;br /&gt;This time I used &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Expression_Encoder"&gt;Expression Encoder&lt;/a&gt;'s Screen Capture feature to record a short video of the demo in action. Please keep in mind that the screen recording software eats up a lot of resources while recording and that the actual frame rate is way better.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9tYn_w0xaZU&amp;hl=de_DE&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9tYn_w0xaZU&amp;hl=de_DE&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Background music is &lt;a href="http://8bitcollective.com/music/4mat/Black+Lipstick+%2830s30d_01%29/"&gt;Black Lipstick&lt;/a&gt; by &lt;a href="http://ihearthesoundofwaves.blogspot.com/"&gt;4mat / ATEbit (Matt Simmonds)&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How it works&lt;/b&gt;&lt;br /&gt;Every time the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.rendering%28VS.95%29.aspx"&gt;CompositionTarget.Rendering&lt;/a&gt; event is fired, a webcam snapshot is taken asynchronously with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource.asynccaptureimage%28VS.96%29.aspx"&gt;CaptureSource.AsyncCaptureImage&lt;/a&gt; method. This snapshot is converted in the right format and passed to the &lt;a href="http://nyatla.jp/nyartoolkit/wiki/index.php?NyARToolkitCS.en"&gt;NyARToolkitCS&lt;/a&gt; library that outputs a transformation matrix. This matrix is used to transform the 3D model. The Balder viewport has a transparent background and the scene with the 3D objects is laid over the webcam video output. Another layer is an image that uses a &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt; and the &lt;a href="http://kodierer.blogspot.com/2009/12/writeablebitmapex-writeablebitmap.html"&gt;WriteableBitmapEx&lt;/a&gt; library to highlight the tracked marker region with a red quad.&lt;br /&gt;Sounds pretty easy, but actually it was not that easy and straight forward. One of the hardest parts was the initialization and to find the right parameters.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Results&lt;/b&gt;&lt;br /&gt;I'm quite satisfied with the results and if you consider that all the heavy computation is done by the CPU, the performance is pretty good as well. The demo runs smoothly at 50-60 &lt;a href="http://en.wikipedia.org/wiki/Frame_rate"&gt;fps&lt;/a&gt; on a dual core machine utilizing its whole power and it should also scale up on more cores.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To be continued&lt;/b&gt; &lt;br /&gt;If you expected source code this time I have to disappoint you. The code is not at that level where it should be, but I wanted to push this demo out. I'm not sure if I find enough time this year to work on the code and I don't want that someone tries to use it in the current state. But trust me, I will provide open source functionality to make Augmented Reality in Silverlight in the near future and I normally &lt;a href="http://kodierer.blogspot.com/2009/12/writeablebitmapex-writeablebitmap.html"&gt;keep my promises&lt;/a&gt;, so stay tuned for more happy days...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 02-24-2010&lt;/b&gt;&lt;br /&gt;This demo is now part of the open source &lt;a href="http://slartoolkit.codeplex.com"&gt;SLARToolkit library&lt;/a&gt; which was announced in &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;this blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 03-15-2010&lt;/b&gt;&lt;br /&gt;Updated to the Silverlight 4 Release Candidate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 04-15-2010&lt;/b&gt;&lt;br /&gt;Updated to the final Silverlight 4 RTW build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-1935849426223852550?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/1935849426223852550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2009/12/world-real-time-3d-augmented-reality.html#comment-form' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1935849426223852550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/1935849426223852550'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2009/12/world-real-time-3d-augmented-reality.html' title='World# - Real Time 3D Augmented Reality with Silverlight'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_EtiC5s1ztXY/Syqv5_vG3XI/AAAAAAAAAJA/VsAWwAN2t1I/s72-c/SLARToolkitSample.jpg' height='72' width='72'/><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-2337666053856916363</id><published>2009-12-07T21:10:00.006+01:00</published><updated>2010-01-18T20:33:50.825+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>WriteableBitmapEx - WriteableBitmap extensions now on CodePlex</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_EtiC5s1ztXY/Sx1KnIEhZ3I/AAAAAAAAAI0/tuWW29yNGso/s1600-h/wbx_announcement.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_EtiC5s1ztXY/Sx1KnIEhZ3I/AAAAAAAAAI0/tuWW29yNGso/s1600/wbx_announcement.png" /&gt;&lt;/a&gt;&lt;/div&gt;I finally kept my promise and put the WriteableBitmap extensions up on &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;CodePlex&lt;/a&gt;. This step was long overdue, but when the Silverlight 4 beta was released I couldn't resist and had to play with the new webcam API first (though I'm not finished yet).&lt;br /&gt;&lt;br /&gt;The  &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt; library project description:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;The WriteableBitmapEx library is a collection of extension methods for Silverlight's &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt;. The WriteableBitmap class that was added in Silverlight 3, allows the direct manipulation of a bitmap and could be used to generate fast procedural images by drawing directly to a bitmap. The WriteableBitmap API is very minimalistic and there's only the raw &lt;a class="externalLink" href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.pixels%28VS.95%29.aspx"&gt;Pixels&lt;/a&gt; array for such operations. The WriteableBitmapEx library tries to compensate that with extensions methods that are easy to use like built in methods. The library extends the WriteableBitmap class with elementary and fast (2D drawing) functionality, supporting common shapes like point, line, ellipse, polyline, quad, rectangle, triangle. Conversion methods and functions to combine WriteableBitmaps (Blitting) are part of it too.&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;Roots&lt;/b&gt; &lt;br /&gt;The &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt; library has its origin in several blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a class="externalLink" href="http://kodierer.blogspot.com/2009/07/writeablebitmap-extension-methods.html"&gt;WriteableBitmap Extension Methods&lt;/a&gt; introduced the SetPixel methods.&lt;/li&gt;&lt;li&gt; &lt;a class="externalLink" href="http://kodierer.blogspot.com/2009/10/drawing-lines-silverlight.html"&gt;Drawing Lines - Silverlight WriteableBitmap Extensions II&lt;/a&gt; provided the DrawLine methods. &amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a class="externalLink" href="http://kodierer.blogspot.com/2009/11/drawing-shapes-silverlight.html"&gt;Drawing Shapes - Silverlight WriteableBitmap Extensions III&lt;/a&gt; brought the shape functionality (ellipse, polyline, quad, rectangle, triangle).&lt;/li&gt;&lt;li&gt;In &lt;a class="externalLink" href="http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html"&gt;Convert, Encode And Decode Silverlight WriteableBitmap Data&lt;/a&gt; I published the byte array conversion methods.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Not at least Silverlight MVP &lt;a class="externalLink" href="http://blogs.silverarcade.com/silverlight-games-101"&gt;Bill Reiss&lt;/a&gt; was faster than me on the Blit functions and introduced these in &lt;a class="externalLink" href="http://blogs.silverarcade.com/silverlight-games-101/15/silverlight-blitting-and-blending-with-silverlights-writeablebitmap/"&gt;Blitting and Blending with Silverlight’s WriteableBitmap&lt;/a&gt;. He was so nice and allowed me to use his code in the &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt; library.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a class="externalLink" href="http://nokola.com/"&gt;Nikola Mihaylov (Nokola)&lt;/a&gt; made some optimizations on the DrawLine and DrawRectangle methods and &lt;a href="http://nokola.com/blog/post/2009/11/06/Faster-DrawLine%28%29-in-Silverlight-%28400000-linessec%29.aspx"&gt;posted&lt;/a&gt; them on his own blog or in the comments of my posts. So a release as open source project was really long overdue. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Additional work&lt;/b&gt; &lt;br /&gt;I recreated the whole Visual Studio 2008 solutions, changed the namespaces, headers, added comments and cleaned up the code base and samples. I also grouped the extension methods into different CS files with a partial class. It is now possible to include just a few methods by using the specific source CS files directly or all extension methods through the built library assembly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;License&lt;/b&gt;&lt;br /&gt;The &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;WriteableBitmapEx&lt;/a&gt; library is released as open source under the &lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;Microsoft Public License&lt;/a&gt; (Ms-PL) license. The Ms-PL license allows the use of the library without affecting the license of the user, thus making it also easily usable for commercial projects. On the other hand the &lt;a href="http://en.wikipedia.org/wiki/Copyleft#Strong_and_weak_copyleft"&gt;weak copyleft&lt;/a&gt; characteristic ensures that changes on the source have to be committed back and that the library or parts of it always be free and never become closed source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Touch it, &lt;strike&gt;Buy it&lt;/strike&gt;, Use it, Break it, Fix it, Trash it, Change it, (Mail) - Upgrade it, &lt;a href="http://en.wikipedia.org/wiki/Technologic"&gt;...&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_EtiC5s1ztXY/Sx1WbP_BfuI/AAAAAAAAAI4/gWX4U2-Nwjg/s1600-h/wbx_logo_4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_EtiC5s1ztXY/Sx1WbP_BfuI/AAAAAAAAAI4/gWX4U2-Nwjg/s1600/wbx_logo_4.png" /&gt;&lt;/a&gt;&lt;/div&gt;The WriteableBitmapEx CodePlex project site lives &lt;a href="http://writeablebitmapex.codeplex.com/"&gt;here&lt;/a&gt;. You might also want to see the &lt;a class="externalLink" href="http://writeablebitmapex.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; for a list of features that will be added in the future or to add your own. If you have any comments, questions, suggestions or want to see your name in the Credits list, don't hesitate and write a comment, use the &lt;a class="externalLink" href="http://writeablebitmapex.codeplex.com/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; on the CodePlex site or contact me via any other media.&lt;br /&gt;Have fun and let me know it if you do some cool stuff with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-2337666053856916363?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/2337666053856916363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2009/12/writeablebitmapex-writeablebitmap.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2337666053856916363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2337666053856916363'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2009/12/writeablebitmapex-writeablebitmap.html' title='WriteableBitmapEx - WriteableBitmap extensions now on CodePlex'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_EtiC5s1ztXY/Sx1KnIEhZ3I/AAAAAAAAAI0/tuWW29yNGso/s72-c/wbx_announcement.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-8657756706507146185</id><published>2009-12-03T23:55:00.026+01:00</published><updated>2010-03-20T13:46:36.152+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Augmented Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><title type='text'>Silverlight 4 Augmented Reality Proof Of Concept</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/Sxg8iDYVpoI/AAAAAAAAAIw/pTzGU4RL02I/s1600/hiro.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/Sxg8iDYVpoI/AAAAAAAAAIw/pTzGU4RL02I/s1600/hiro.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: red;"&gt;Please goto: &lt;a href="http://kodierer.blogspot.com/2009/12/world-real-time-3d-augmented-reality.html" style="color: red;"&gt;World# - Real Time 3D Augmented Reality with Silverlight&lt;/a&gt;. Such demos are now easily possible with the open source &lt;a href="http://kodierer.blogspot.com/2010/02/slartoolkit-silverlight-augmented.html"&gt;SLARToolkit&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In this short blog post I want to present a demo I've actually made last week. Unfortunately I had no time to work on it since then. This demo is a proof of concept for doing &lt;a href="http://en.wikipedia.org/wiki/Augmented_Reality"&gt;Augmented Reality&lt;/a&gt; with Silverlight 4 and the built-in &lt;a href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#webcam"&gt;webcam API&lt;/a&gt;. &lt;br /&gt;I use the open source Augmented Reality library &lt;a href="http://nyatla.jp/nyartoolkit/wiki/index.php?NyARToolkitCS.en"&gt;NyARToolkitCS&lt;/a&gt; and implemented the necessary interfaces to make it work with Silverlight. The &lt;a href="http://nyatla.jp/nyartoolkit/wiki/index.php?NyARToolkitCS.en"&gt;NyARToolkitCS&lt;/a&gt; library is a completely managed version of the well known &lt;a href="http://en.wikipedia.org/wiki/ARToolKit"&gt;ARToolkit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Video&lt;/b&gt;&lt;br /&gt;I've recorded a short video with my iPhone 3GS. The video was recorded at night and it's no secret that the iPhone camera is not the best, but I think it's good enough to see how the marker is tracked and the Silverlight logo moves with it.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/g0iuecmqmkU&amp;hl=de&amp;fs=1&amp;ap=%2526fmt%3D18"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/g0iuecmqmkU&amp;hl=de&amp;fs=1&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Background music is "You have something in your scowl" by &lt;a href="http://www.henrikjose.com/"&gt;Henrik José / Bliss&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To be continued&lt;/b&gt;&lt;br /&gt;The first results are quite good and the demo runs smoothly at 60-70 &lt;a href="http://en.wikipedia.org/wiki/Frame_rate"&gt;fps&lt;/a&gt; on a dual core machine utilizing both cores. I will continue my work on this project and provide more details, samples and of course source code. &lt;br /&gt;Stay tuned...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-8657756706507146185?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/8657756706507146185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2009/12/silverlight-4-augmented-reality-proof.html#comment-form' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8657756706507146185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/8657756706507146185'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2009/12/silverlight-4-augmented-reality-proof.html' title='Silverlight 4 Augmented Reality Proof Of Concept'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_EtiC5s1ztXY/Sxg8iDYVpoI/AAAAAAAAAIw/pTzGU4RL02I/s72-c/hiro.jpg' height='72' width='72'/><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-2948888175913038694</id><published>2009-11-30T22:29:00.036+01:00</published><updated>2010-10-18T09:03:09.305+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmapEx'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 3'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='JPEG'/><title type='text'>Convert, Encode And Decode Silverlight WriteableBitmap Data</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/SxQ3AgDkvTI/AAAAAAAAAIs/DRkLIqrSZk8/s1600/noise.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/SxQ3AgDkvTI/AAAAAAAAAIs/DRkLIqrSZk8/s1600/noise.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;In the &lt;a href="http://kodierer.blogspot.com/2009/11/edgecam-shots-saving-silverlight-4.html?showComment=1259600436366#c2635399119258656817"&gt;comments&lt;/a&gt; of my Silverlight 4 &lt;a href="http://kodierer.blogspot.com/2009/11/edgecam-shots-saving-silverlight-4.html"&gt;EdgeCam Shots&lt;/a&gt; blog post "marcb" asked me how to convert the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28VS.95%29.aspx"&gt;WriteableBitmap&lt;/a&gt; to a byte array to save the snapshot in a database. &lt;br /&gt;I thought the answer might be also useful for others. Furthermore I will provide ready to use code for &lt;a href="http://en.wikipedia.org/wiki/Jpeg"&gt;JPEG&lt;/a&gt; encoding and decoding of the WriteableBitmap.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Byte array conversion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Copy WriteableBitmap to ARGB byte array&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static byte[] ToByteArray(this WriteableBitmap bmp)&lt;br /&gt;{&lt;br /&gt;   int[] p = bmp.Pixels;&lt;br /&gt;   int len = p.Length * 4;&lt;br /&gt;   byte[] result = new byte[len]; // ARGB&lt;br /&gt;   Buffer.BlockCopy(p, 0, result, 0, len);&lt;br /&gt;   return result;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Copy ARGB byte array into WriteableBitmap&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static void FromByteArray(this WriteableBitmap bmp, byte[] buffer)&lt;br /&gt;{&lt;br /&gt;   Buffer.BlockCopy(buffer, 0, bmp.Pixels, 0, buffer.Length);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Usage &lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Render UIElement into WriteableBitmap&lt;br /&gt;WriteableBitmap bmp = new WriteableBitmap(UIElement, null);&lt;br /&gt;&lt;br /&gt;// Copy WriteableBitmap.Pixels into byte array (format ARGB)&lt;br /&gt;byte[] buffer = bmp.ToByteArray();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Create a new WriteableBitmap with the size of the original image&lt;br /&gt;WriteableBitmap bmp = new WriteableBitmap(width, height);&lt;br /&gt;&lt;br /&gt;// Fill WriteableBitmap from byte array (format ARGB)&lt;br /&gt;bmp.FromByteArray(buffer);&lt;/pre&gt;&lt;br /&gt;I will include the two methods in my &lt;a href="http://kodierer.blogspot.com/2009/11/drawing-shapes-silverlight.html"&gt;WriteableBitmap extensions&lt;/a&gt; that I'm going to put up on &lt;a href="http://www.codeplex.com/"&gt;Codeplex&lt;/a&gt; soon.    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JPEG encoding and decoding&lt;/b&gt;&lt;br /&gt;If you want to store many images or transport them over a network the needed storage size could quickly become a big problem. For example an image with the size 512 x 512 needs 1 Megabyte storage space and a 1024 x 768 image even 3 MB. A solution could be image compression using &lt;a href="http://en.wikipedia.org/wiki/Jpeg"&gt;JPEG&lt;/a&gt; encoding and decoding. To accomplish this I've used the open source &lt;a href="http://code.google.com/p/fjcore/"&gt;FJCore&lt;/a&gt; JPEG library which is distributed under the &lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;MIT License&lt;/a&gt; and works nicely with Silverlight.   &lt;br /&gt;&lt;br /&gt;Encode WriteableBitmap as JPEG stream &lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static void EncodeJpeg(WriteableBitmap bmp, Stream destinationStream)&lt;br /&gt;{&lt;br /&gt;   // Init buffer in FluxJpeg format&lt;br /&gt;   int w = bmp.PixelWidth;&lt;br /&gt;   int h = bmp.PixelHeight;&lt;br /&gt;   int[] p = bmp.Pixels;&lt;br /&gt;   byte[][,] pixelsForJpeg = new byte[3][,]; // RGB colors&lt;br /&gt;   pixelsForJpeg[0] = new byte[w, h];&lt;br /&gt;   pixelsForJpeg[1] = new byte[w, h];&lt;br /&gt;   pixelsForJpeg[2] = new byte[w, h];&lt;br /&gt;&lt;br /&gt;   // Copy WriteableBitmap data into buffer for FluxJpeg&lt;br /&gt;   int i = 0;&lt;br /&gt;   for (int y = 0; y &amp;lt; h; y++)&lt;br /&gt;   {&lt;br /&gt;      for (int x = 0; x &amp;lt; w; x++)&lt;br /&gt;      {&lt;br /&gt;         int color = p[i++];&lt;br /&gt;         pixelsForJpeg[0][x, y] = (byte)(color &amp;gt;&amp;gt; 16); // R&lt;br /&gt;         pixelsForJpeg[1][x, y] = (byte)(color &amp;gt;&amp;gt; 8);  // G&lt;br /&gt;         pixelsForJpeg[2][x, y] = (byte)(color);       // B&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Encode Image as JPEG using the FluxJpeg library&lt;br /&gt;   // and write to destination stream&lt;br /&gt;   ColorModel cm = new ColorModel { colorspace = ColorSpace.RGB };&lt;br /&gt;   FluxJpeg.Core.Image jpegImage = new FluxJpeg.Core.Image(cm, pixelsForJpeg);&lt;br /&gt;   JpegEncoder encoder = new JpegEncoder(jpegImage, 95, destinationStream);&lt;br /&gt;   encoder.Encode();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Decode WriteableBitmap from JPEG stream &lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static WriteableBitmap DecodeJpeg(Stream sourceStream)&lt;br /&gt;{&lt;br /&gt;   // Decode JPEG from stream&lt;br /&gt;   var decoder = new FluxJpeg.Core.Decoder.JpegDecoder(sourceStream);&lt;br /&gt;   var jpegDecoded = decoder.Decode();&lt;br /&gt;   var img = jpegDecoded.Image;&lt;br /&gt;   img.ChangeColorSpace(ColorSpace.RGB);&lt;br /&gt;&lt;br /&gt;   // Init Buffer&lt;br /&gt;   int w = img.Width;&lt;br /&gt;   int h = img.Height;&lt;br /&gt;   var result = new WriteableBitmap(w, h);&lt;br /&gt;   int[] p = result.Pixels;&lt;br /&gt;   byte[][,] pixelsFromJpeg = img.Raster;&lt;br /&gt;&lt;br /&gt;   // Copy FluxJpeg buffer into WriteableBitmap&lt;br /&gt;   int i = 0;&lt;br /&gt;   for (int y = 0; y &amp;lt; h; y++)&lt;br /&gt;   {&lt;br /&gt;      for (int x = 0; x &amp;lt; w; x++)&lt;br /&gt;      {&lt;br /&gt;         p[i++] = (0xFF &amp;lt;&amp;lt; 24)                    // A&lt;br /&gt;                | (pixelsFromJpeg[0][x, y] &amp;lt;&amp;lt; 16) // R&lt;br /&gt;                | (pixelsFromJpeg[1][x, y] &amp;lt;&amp;lt; 8)  // G&lt;br /&gt;                |  pixelsFromJpeg[2][x, y];       // B&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return result;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Usage &lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;// Save rendered UIElement as JPEG file&lt;br /&gt;private void BtnSaveFile_Click(object sender, RoutedEventArgs e)&lt;br /&gt;{   &lt;br /&gt;   if (saveFileDlg.ShowDialog().Value)&lt;br /&gt;   {&lt;br /&gt;      using (Stream dstStream = saveFileDlg.OpenFile())&lt;br /&gt;      {&lt;br /&gt;         // Render to WriteableBitmap&lt;br /&gt;         WriteableBitmap bmp = new WriteableBitmap(UIElement, null);&lt;br /&gt;         &lt;br /&gt;         // Encode JPEG and write to FileStream&lt;br /&gt;         EncodeJpeg(bmp, dstStream);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Open JPEG file and read into a WriteableBitmap&lt;br /&gt;private void BtnLoadFile_Click(object sender, RoutedEventArgs e)&lt;br /&gt;{   &lt;br /&gt;   if (openFileDialog.ShowDialog().Value)&lt;br /&gt;   {&lt;br /&gt;      using (System.IO.Stream srcStream = openFileDialog.File.OpenRead())&lt;br /&gt;      {         &lt;br /&gt;         // Read JPEG file and decode it&lt;br /&gt;         WriteableBitmap bmp = DecodeJpeg(srcStream);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Keep in mind that the standard &lt;a href="http://en.wikipedia.org/wiki/Jpeg"&gt;JPEG&lt;/a&gt; format doesn't support alpha values (transparency) and that the compression is &lt;a href="http://en.wikipedia.org/wiki/Lossy_compression"&gt;lossy&lt;/a&gt;. So don't encode and decode images subsequently with JPEG.&lt;br /&gt;It is also possible to use the built-in Silverlight class BitmapSource and its &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapsource.setsource(v=VS.95).aspx"&gt;SetSource method&lt;/a&gt; to decode an JPEG stream.&lt;br /&gt;&lt;pre class="brush: c-sharp;"&gt;public static WriteableBitmap DecodeJpegWithBitmapSource(Stream sourceStream)&lt;br /&gt;{&lt;br /&gt;   // Decode JPEG from stream&lt;br /&gt;   var bitmapSource = new BitmapSource();&lt;br /&gt;   bitmapSource.SetSource(sourceStream);&lt;br /&gt;   return new WriteableBitmap(bitmapSource);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Source code&lt;/b&gt;&lt;br /&gt;Check out my Codeplex project &lt;a href="http://writeablebitmapex.codeplex.com"&gt;WriteableBitmapEx&lt;/a&gt; for an up to date version of the byte array conversion methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/563071785757928434-2948888175913038694?l=kodierer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kodierer.blogspot.com/feeds/2948888175913038694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html#comment-form' title='44 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2948888175913038694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/563071785757928434/posts/default/2948888175913038694'/><link rel='alternate' type='text/html' href='http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html' title='Convert, Encode And Decode Silverlight WriteableBitmap Data'/><author><name>Rene Schulte</name><uri>http://www.blogger.com/profile/12777157871967896549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://1.bp.blogspot.com/_EtiC5s1ztXY/SgLxDjl6yUI/AAAAAAAAAAM/GzTXzXZuoJA/S220/avatar3_bw.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_EtiC5s1ztXY/SxQ3AgDkvTI/AAAAAAAAAIs/DRkLIqrSZk8/s72-c/noise.jpg' height='72' width='72'/><thr:total>44</thr:total></entry><entry><id>tag:blogger.com,1999:blog-563071785757928434.post-3683449013240253803</id><published>2009-11-23T20:20:00.023+01:00</published><updated>2010-05-16T13:31:01.162+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Computer graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Webcam'/><category scheme='http://www.blogger.com/atom/ns#' term='HLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='WriteableBitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='JPEG'/><title type='text'>EdgeCam Shots - Saving Silverlight 4 Webcam Snapshots to JPEG</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_EtiC5s1ztXY/Swks8fddJ-I/AAAAAAAAAIk/sEUNBloOLjI/s1600/EdgeCam_Family.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_EtiC5s1ztXY/Swks8fddJ-I/AAAAAAAAAIk/sEUNBloOLjI/s1600/EdgeCam_Family.png" /&gt;&lt;/a&gt;&lt;/div&gt;In my last &lt;a href="http://kodierer.blogspot.com/2009/11/edgecam-silverlight-4-webcam-edge.html"&gt;blog post&lt;/a&gt; I have covered the new &lt;a href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#webcam"&gt;Silverlight 4 Webcam API&lt;/a&gt; and provided a demo that used my &lt;a href="http://kodierer.blogspot.com/2009/07/livin-on-edge-silverlight-parametric_4324.html"&gt;edge detection pixel shader&lt;/a&gt; to create a nice real time webcam effect. In this post I make an extended version available which can save webcam snapshots as &lt;a href="http://en.wikipedia.org/wiki/Jpeg"&gt;JPEG&lt;/a&gt; files and I also discuss some limitations of the webcam API's built-in &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.capturesource.asynccaptureimage%28VS.96%29.aspx"&gt;CaptureSource.AsyncCaptureImage&lt;/a&gt; snapshot method. Furthermore I will give some ideas on how to build a Silverlight 4 video chat / conference application on top of the provided JPEG capturing and encoding code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Live&lt;/b&gt;&lt;br /&gt;To view the application you need to install the Silverlight 4 runtime. It's available for &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkID=149156"&gt;Windows&lt;/a&gt; and &lt;a class="externalLink" href="http://go.microsoft.com/fwlink/?LinkId=107365"&gt;Mac&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://dl.dropbox.com/u/2681028/BlogData/EdgeCam/Snapshot/TestPage.html" target="_blank"&gt;Open the sample in a new page&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_EtiC5s1ztXY/S6TIEQIsytI/AAAAAAAAAKo/dSeRq83f_9c/s1600-h/edgecam2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_EtiC5s1ztXY/S6TIEQIsytI/AAAAAAAAAKo/dSeRq83f_9c/s400/edgecam2.jpg" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The Webcam c
