1: void OnCameraCaptureCompleted(object sender, PhotoResult e)
<pre class="alteven"><span id="lnum2" class="lnum"> 2:</span> {</pre>
<pre class="alteven"><span id="lnum3" class="lnum"> 3:</span> <span class="rem">// figure out the orientation from EXIF data</span></pre>
<pre class="alteven"><span id="lnum4" class="lnum"> 4:</span> e.ChosenPhoto.Position = 0;</pre>
<pre class="alteven"><span id="lnum5" class="lnum"> 5:</span> JpegInfo info = ExifReader.ReadJpeg(e.ChosenPhoto, e.OriginalFileName);</pre>
<pre class="alteven"><span id="lnum6" class="lnum"> 6:</span> </pre>
<pre class="alteven"><span id="lnum7" class="lnum"> 7:</span> _width = info.Width;</pre>
<pre class="alteven"><span id="lnum8" class="lnum"> 8:</span> _height = info.Height;</pre>
<pre class="alteven"><span id="lnum9" class="lnum"> 9:</span> _orientation = info.Orientation;</pre>
<pre class="alteven"><span id="lnum10" class="lnum"> 10:</span> </pre>
<pre class="alteven"><span id="lnum11" class="lnum"> 11:</span> PostedUri.Text = info.Orientation.ToString();</pre>
<pre class="alteven"><span id="lnum12" class="lnum"> 12:</span> </pre>
<pre class="alteven"><span id="lnum13" class="lnum"> 13:</span> <span class="kwrd">switch</span> (info.Orientation)</pre>
<pre class="alteven"><span id="lnum14" class="lnum"> 14:</span> {</pre>
<pre class="alteven"><span id="lnum15" class="lnum"> 15:</span> <span class="kwrd">case</span> ExifOrientation.TopLeft:</pre>
<pre class="alteven"><span id="lnum16" class="lnum"> 16:</span> <span class="kwrd">case</span> ExifOrientation.Undefined:</pre>
<pre class="alteven"><span id="lnum17" class="lnum"> 17:</span> _angle = 0;</pre>
<pre class="alteven"><span id="lnum18" class="lnum"> 18:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum19" class="lnum"> 19:</span> <span class="kwrd">case</span> ExifOrientation.TopRight:</pre>
<pre class="alteven"><span id="lnum20" class="lnum"> 20:</span> _angle = 90;</pre>
<pre class="alteven"><span id="lnum21" class="lnum"> 21:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum22" class="lnum"> 22:</span> <span class="kwrd">case</span> ExifOrientation.BottomRight:</pre>
<pre class="alteven"><span id="lnum23" class="lnum"> 23:</span> _angle = 180;</pre>
<pre class="alteven"><span id="lnum24" class="lnum"> 24:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum25" class="lnum"> 25:</span> <span class="kwrd">case</span> ExifOrientation.BottomLeft:</pre>
<pre class="alteven"><span id="lnum26" class="lnum"> 26:</span> _angle = 270;</pre>
<pre class="alteven"><span id="lnum27" class="lnum"> 27:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum28" class="lnum"> 28:</span> }</pre>
<pre class="alteven"><span id="lnum29" class="lnum"> 29:</span> </pre>
<pre class="alteven"><span id="lnum30" class="lnum"> 30:</span> <span class="kwrd">if</span> (_angle > 0d)</pre>
<pre class="alteven"><span id="lnum31" class="lnum"> 31:</span> {</pre>
<pre class="alteven"><span id="lnum32" class="lnum"> 32:</span> capturedImage = RotateStream(e.ChosenPhoto, _angle);</pre>
<pre class="alteven"><span id="lnum33" class="lnum"> 33:</span> }</pre>
<pre class="alteven"><span id="lnum34" class="lnum"> 34:</span> <span class="kwrd">else</span></pre>
<pre class="alteven"><span id="lnum35" class="lnum"> 35:</span> {</pre>
<pre class="alteven"><span id="lnum36" class="lnum"> 36:</span> capturedImage = e.ChosenPhoto;</pre>
<pre class="alteven"><span id="lnum37" class="lnum"> 37:</span> }</pre>
<pre class="alteven"><span id="lnum38" class="lnum"> 38:</span> </pre>
<pre class="alteven"><span id="lnum39" class="lnum"> 39:</span> BitmapImage bmp = <span class="kwrd">new</span> BitmapImage();</pre>
<pre class="alteven"><span id="lnum40" class="lnum"> 40:</span> bmp.SetSource(capturedImage);</pre>
<pre class="alteven"><span id="lnum41" class="lnum"> 41:</span> </pre>
<pre class="alteven"><span id="lnum42" class="lnum"> 42:</span> ChosenPicture.Source = bmp; </pre>
<pre class="alteven"><span id="lnum43" class="lnum"> 43:</span> }</pre>
<pre class="alteven"><span id="lnum44" class="lnum"> 44:</span> </pre>
<pre class="alteven"><span id="lnum45" class="lnum"> 45:</span> <span class="kwrd">private</span> Stream RotateStream(Stream stream, <span class="kwrd">int</span> angle)</pre>
<pre class="alteven"><span id="lnum46" class="lnum"> 46:</span> {</pre>
<pre class="alteven"><span id="lnum47" class="lnum"> 47:</span> stream.Position = 0;</pre>
<pre class="alteven"><span id="lnum48" class="lnum"> 48:</span> <span class="kwrd">if</span> (angle % 90 != 0 || angle < 0) <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentException();</pre>
<pre class="alteven"><span id="lnum49" class="lnum"> 49:</span> <span class="kwrd">if</span> (angle % 360 == 0) <span class="kwrd">return</span> stream;</pre>
<pre class="alteven"><span id="lnum50" class="lnum"> 50:</span> </pre>
<pre class="alteven"><span id="lnum51" class="lnum"> 51:</span> BitmapImage bitmap = <span class="kwrd">new</span> BitmapImage();</pre>
<pre class="alteven"><span id="lnum52" class="lnum"> 52:</span> bitmap.SetSource(stream);</pre>
<pre class="alteven"><span id="lnum53" class="lnum"> 53:</span> WriteableBitmap wbSource = <span class="kwrd">new</span> WriteableBitmap(bitmap);</pre>
<pre class="alteven"><span id="lnum54" class="lnum"> 54:</span> </pre>
<pre class="alteven"><span id="lnum55" class="lnum"> 55:</span> WriteableBitmap wbTarget = <span class="kwrd">null</span>;</pre>
<pre class="alteven"><span id="lnum56" class="lnum"> 56:</span> <span class="kwrd">if</span> (angle % 180 == 0)</pre>
<pre class="alteven"><span id="lnum57" class="lnum"> 57:</span> {</pre>
<pre class="alteven"><span id="lnum58" class="lnum"> 58:</span> wbTarget = <span class="kwrd">new</span> WriteableBitmap(wbSource.PixelWidth, wbSource.PixelHeight);</pre>
<pre class="alteven"><span id="lnum59" class="lnum"> 59:</span> }</pre>
<pre class="alteven"><span id="lnum60" class="lnum"> 60:</span> <span class="kwrd">else</span></pre>
<pre class="alteven"><span id="lnum61" class="lnum"> 61:</span> {</pre>
<pre class="alteven"><span id="lnum62" class="lnum"> 62:</span> wbTarget = <span class="kwrd">new</span> WriteableBitmap(wbSource.PixelHeight, wbSource.PixelWidth);</pre>
<pre class="alteven"><span id="lnum63" class="lnum"> 63:</span> }</pre>
<pre class="alteven"><span id="lnum64" class="lnum"> 64:</span> </pre>
<pre class="alteven"><span id="lnum65" class="lnum"> 65:</span> <span class="kwrd">for</span> (<span class="kwrd">int</span> x = 0; x < wbSource.PixelWidth; x++)</pre>
<pre class="alteven"><span id="lnum66" class="lnum"> 66:</span> {</pre>
<pre class="alteven"><span id="lnum67" class="lnum"> 67:</span> <span class="kwrd">for</span> (<span class="kwrd">int</span> y = 0; y < wbSource.PixelHeight; y++)</pre>
<pre class="alteven"><span id="lnum68" class="lnum"> 68:</span> {</pre>
<pre class="alteven"><span id="lnum69" class="lnum"> 69:</span> <span class="kwrd">switch</span> (angle % 360)</pre>
<pre class="alteven"><span id="lnum70" class="lnum"> 70:</span> {</pre>
<pre class="alteven"><span id="lnum71" class="lnum"> 71:</span> <span class="kwrd">case</span> 90:</pre>
<pre class="alteven"><span id="lnum72" class="lnum"> 72:</span> wbTarget.Pixels[(wbSource.PixelHeight - y - 1) + x * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];</pre>
<pre class="alteven"><span id="lnum73" class="lnum"> 73:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum74" class="lnum"> 74:</span> <span class="kwrd">case</span> 180:</pre>
<pre class="alteven"><span id="lnum75" class="lnum"> 75:</span> wbTarget.Pixels[(wbSource.PixelWidth - x - 1) + (wbSource.PixelHeight - y - 1) * wbSource.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];</pre>
<pre class="alteven"><span id="lnum76" class="lnum"> 76:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum77" class="lnum"> 77:</span> <span class="kwrd">case</span> 270:</pre>
<pre class="alteven"><span id="lnum78" class="lnum"> 78:</span> wbTarget.Pixels[y + (wbSource.PixelWidth - x - 1) * wbTarget.PixelWidth] = wbSource.Pixels[x + y * wbSource.PixelWidth];</pre>
<pre class="alteven"><span id="lnum79" class="lnum"> 79:</span> <span class="kwrd">break</span>;</pre>
<pre class="alteven"><span id="lnum80" class="lnum"> 80:</span> }</pre>
<pre class="alteven"><span id="lnum81" class="lnum"> 81:</span> }</pre>
<pre class="alteven"><span id="lnum82" class="lnum"> 82:</span> }</pre>
<pre class="alteven"><span id="lnum83" class="lnum"> 83:</span> MemoryStream targetStream = <span class="kwrd">new</span> MemoryStream();</pre>
<pre class="alteven"><span id="lnum84" class="lnum"> 84:</span> wbTarget.SaveJpeg(targetStream, wbTarget.PixelWidth, wbTarget.PixelHeight, 0, 100);</pre>
<pre class="alteven"><span id="lnum85" class="lnum"> 85:</span> <span class="kwrd">return</span> targetStream;</pre>
<pre class="alteven"><span id="lnum86" class="lnum"> 86:</span> }</pre>