【问题标题】:Using a square image on a wide tile in Windows Store App在 Windows 应用商店应用中的宽磁贴上使用方形图像
【发布时间】:2015-03-22 11:42:38
【问题描述】:

在我的应用程序中,我想实现辅助磁贴,以便让用户直接访问我的应用程序的特定部分并在该磁贴上显示部分特定信息。

对于平铺图像,我想使用将直接访问的部分的图标,但我只能访问直接从网络链接下载的方形图像(在创建平铺时)。由于我没有宽图块的图像,因此我尝试用透明边框填充它们以创建宽图块。我使用了 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,但这是另一个问题,因为我还不知道如何创建位图。

提前感谢您的帮助。

【问题讨论】:

    标签: c# windows-store-apps image-scaling live-tile


    【解决方案1】:

    我找到了解决方案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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多