Friday, February 1, 2013

WriteableBitmap.Savejpeg does not render grid text (image is OK)

WriteableBitmap.Savejpeg does not render grid text (image is OK)

I have a Grid in a user control:

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneAccentBrush}">     <Image          x:Name="imgBack"         Opacity=".25" />     <Grid VerticalAlignment="Top" HorizontalAlignment="Left">         <Grid.RowDefinitions>             <RowDefinition Height="Auto" />             <RowDefinition Height="Auto" />             <RowDefinition Height="Auto" />             <RowDefinition Height="Auto" />             <RowDefinition Height="Auto" />             <RowDefinition Height="Auto" />         </Grid.RowDefinitions>         <Grid.ColumnDefinitions>             <ColumnDefinition Width="Auto" />         </Grid.ColumnDefinitions>         <!-- Some textblocks --> </Grid> 

The size of the grid & source of the image is set dynamically at runtime:

public void ChangeSizeAndImage(int width, int height, string backImagePath) {     // Set the height and width     LayoutRoot.Width = width;     LayoutRoot.Height = height;      // Set the background image     imgBack.Source = new BitmapImage(new Uri(backImagePath, UriKind.RelativeOrAbsolute));      this.UpdateLayout(); } 

I then call a method that generates a jpeg from the ui element & saves it to IsolatedStorage (later adding to a Windows Phone Live Tile)

public static Uri CreateImageFromUIElement(UIElement element, int width, int height) {     // Instance to store the image in     IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication();      // Random ID to use for the file name     string id = Guid.NewGuid().ToString("n");      // create directory to read/write from     const string shellContentDirectory = "Shared\\ShellContent";     userStore.CreateDirectory(shellContentDirectory);      // Render the UIElement into a writeable bitmap     WriteableBitmap bitmap = new WriteableBitmap(element, new CompositeTransform());      // Save the bitmap to a file. This stream must be closed in order to be read later     string imagePath = shellContentDirectory + "\\" + id + ".jpg";     using (IsolatedStorageFileStream stream = userStore.OpenFile(imagePath, System.IO.FileMode.Create))     {         bitmap.SaveJpeg(stream, width, height, 0, 100);     }      // Uri to get us to the image     Uri imageUri = new Uri("isostore:/" + imagePath.Replace('\\', '/'));     return imageUri; } 

I'm able to successfully use the image on the tile, except I only see the image with a black background, and I don't see any of the text. I'm thinking that this has something to do with jpeg's and transparent PNG's, however, I'm setting the background on the Grid above with a color, so I'm not sure why it would be considered to be transparent.

Answers & Comments...




No comments:

Post a Comment

Send us your comment related to the topic mentioned on the blog