2015-03-22 3 views
0

В моем приложении я хочу реализовать вторичные плитки, чтобы пользователи могли напрямую обращаться к определенным разделам моего приложения и показывать информацию о конкретном разделе этой плитки.Использование квадратного изображения на широкой плитке в приложении Windows Store Приложение

Для изображения в виде плитки Я хочу использовать значок раздела, к которому будет обращаться напрямую, но у меня есть только доступ к изображениям квадратного размера, которые загружаются непосредственно из веб-ссылки (при создании плитки). Поскольку у меня нет изображений для широких плит, я попытался проложить их прозрачными границами, чтобы создать широкую плитку. Я использовал библиотеку WritableBitmapEx, но мой код вызывает AccessViolationException.

StorageFile file = await ApplicationData.Current.TemporaryFolder.GetFileAsync(tempFileName); 
IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);            

WriteableBitmap bitmap = new WriteableBitmap(150, 150); 
await bitmap.SetSourceAsync(fileStream); 

WriteableBitmap bitmapDummy = BitmapFactory.New(310, 150); 

using (bitmapDummy.GetBitmapContext()) 
{ 
    using (bitmap.GetBitmapContext()) 
    { 
     bitmapDummy.Blit(new Rect(80.0, 0.0, 150, 150), bitmap, new Rect(0.0, 0.0, 150, 150), WriteableBitmapExtensions.BlendMode.None); 
    } 
} 

Исключение составляет bitmap.GetBitmapContext(), поэтому я не могу создать изображение.

Что я пытаюсь сделать здесь, это создать пустое изображение с широким черепицей и поместить изображение квадратной плитки посередине.

Также в конце я хочу преобразовать изображение в прозрачный PNG, но это еще одна проблема, поскольку я не могу разобраться, как создать растровое изображение.

Спасибо за помощь.

ответ

0

Я нашел решение here. Кажется, что изображение не было загружено в WriteableBitmap, прежде чем я попытался получить к нему доступ, поэтому было выбрано AccessViolationException. Поэтому вместо того,

WriteableBitmap bitmap = new WriteableBitmap(150, 150); 
await bitmap.SetSourceAsync(fileStream); 

Я начал использовать,

WriteableBitmap bitmap = await BitmapFactory.New(1, 1).FromStream(fileStream); 

и проблема теперь решена.

Полный код, который изменяет размер и прокладывает квадратное изображение для тех, кто находит этот вопрос ниже.

public static async Task PadPngImage(StorageFile inputFile, StorageFile outputFile, uint width, uint height, uint boundingBoxWidth, uint boundingBoxHeight) 
{ 
    // Resize the input image 
    StorageFile temporaryFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("PadImageTemporaryFile.png", CreationCollisionOption.ReplaceExisting); 
    await ResizeImage(inputFile, temporaryFile, width, height);    

    // Create a stream linked to resized image 
    using (IRandomAccessStream temporaryFileStream = await temporaryFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)) 
    { 
     WriteableBitmap bitmap = await BitmapFactory.New(1, 1).FromStream(temporaryFileStream); 

     // Create an empty image with specified bounding dimentions 
     WriteableBitmap bitmapDummy = BitmapFactory.New((int)boundingBoxWidth, (int)boundingBoxHeight); 

     using (bitmapDummy.GetBitmapContext()) 
     { 
      using (bitmap.GetBitmapContext()) 
      { 
       // Calculate position of the image 
       Rect center = new Rect((boundingBoxWidth - width)/2, (boundingBoxHeight - height)/2, width, height); 

       bitmapDummy.Blit(center, bitmap, new Rect(0.0, 0.0, width, height), WriteableBitmapExtensions.BlendMode.None);       
      } 
     } 

     using(IRandomAccessStream stream = await outputFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)) 
     { 
      await bitmapDummy.ToStream(stream, BitmapEncoder.PngEncoderId); 
     }     
    } 
} 

public static async Task ResizeImage(StorageFile inputFile, StorageFile outputFile, uint newWidth, uint newHeight) 
{ 
    // Input Stream & Decoder 
    using (IRandomAccessStream fileStream = await inputFile.OpenAsync(Windows.Storage.FileAccessMode.Read)) 
    { 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); 

     // Output Stream & Encoder     
     using (IRandomAccessStream stream = await outputFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)) 
     { 
      BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(stream, decoder); 

      // Scale the bitmap image 
      encoder.BitmapTransform.ScaledWidth = newWidth; 
      encoder.BitmapTransform.ScaledHeight = newHeight; 
      encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant; 

      await encoder.FlushAsync(); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^