1

セカンダリ タイル イメージのソースとして書き込み可能なビットマップを必死に設定しようとしています。私はほとんどそこにいると思いますが、うまくいきません。私が欠けているものを見ることができますか?私は非常に感謝されます!

私は以下を使用してビットマップを作成しています:

var bitmap = new WriteableBitmap(150, 150);
            Stream stream = bitmap.PixelBuffer.AsStream();
            stream.Seek(0, SeekOrigin.Begin);

            var pixels = new byte[stream.Length];
            for (int i = 0; i < pixels.Length; i += 4)
            {
                pixels[i] = 255;
                pixels[i + 1] = 0;
                pixels[i + 2] = 189;
                pixels[i + 3] = 9;
            }

            stream.Write(pixels, 0, pixels.Length);
            bitmap.Invalidate();

画像は次のようにコンピューターに保存されます。

await WriteableBitmapSaveExtensions.SaveToFile(bitmap, ApplicationData.Current.LocalFolder,"image.png", CreationCollisionOption.ReplaceExisting);

イメージは次のディレクトリにあります。

C:\Users\<USER>\AppData\Local\Packages\<PKGID>\LocalState 

この方法を使用してセカンダリ タイルを作成しています。

CreateSecondaryTileFromWebImage("image.png", "tildId","shortName","displayName","arguments", MainPage.GetElementRect((FrameworkElement)sender));

public async Task CreateSecondaryTileFromWebImage(string bitmapName, string tileId, string shortName, string displayName, string arguments, Rect selection)
    {
        //Create uri
        var bitmap = new Uri(string.Format("ms-appdata:///local/{0}", bitmapName));

        //Create tile
        SecondaryTile secondaryTile = new SecondaryTile(tileId, shortName, displayName, arguments, TileOptions.ShowNameOnLogo, bitmap);

        //Confirm creation
        await secondaryTile.RequestCreateForSelectionAsync(selection, Windows.UI.Popups.Placement.Above);
    }

タイルが作成され、開始画面にピン留めされますが、画像は 100% 透明です。

4

1 に答える 1

0

コードを修正すると、次のディレクトリに有効な .png ファイルが生成されます: C:\Users\\AppData\Local\Packages\\LocalState

WriteableBitmap ピクセルをどのように書き込んでいたかという単純な問題であることがわかりました。WriteableBitmap データ ストリーム形式は ARGB ですが、バイトを逆方向に書き込む必要があります。私の質問では、実際にすべてのピクセルを次のように割り当てています: BGRA = 255,0,189,9

透明度バイトが 9 に設定されている場合、画像はほぼ 100% 透明になり、正しく読み込まれなかったように見えます。

したがって、希望の色を得るには、代わりに次のように書く必要があります。

var pixels = new byte[stream.Length];
        for (int i = 0; i < pixels.Length; i += 4)
        {
            pixels[i] = 9;
            pixels[i + 1] = 189;
            pixels[i + 2] = 0;
            pixels[i + 3] = 255;
        }
于 2013-04-06T13:29:22.213 に答える