WriteableBitmap.Render改变图像中的颜色

时间:2015-03-17 20:17:00

标签: c# silverlight windows-phone-8.1 render writeablebitmap

所以我试图保存一个用户控件的png以用作图块。我正在使用的代码是

SquareTile sq = new SquareTile();
sq.Measure(new Size(336,336));
sq.Arrange(new Rect(0,0,336,336));
RenderExtensions.SaveToFile(sq);

RenderExtension类看起来像这样

public static class RenderExtensions
{
    public static bool SaveToFile(this UIElement visualTreeElement)
    {
        WriteableBitmap wb = new WriteableBitmap(336, 336);
        wb.Render(visualTreeElement, null);
        wb.Invalidate();
        return wb.SaveToFile();
    }

    public static bool SaveToFile(this WriteableBitmap renderTargetBitmap)
    {
        try
        {
            string fname = "Shared/ShellContent/SquareTile.png";

            //StorageFile liveTileImageFile = localFolder.CreateFile("/Shared/ShellContent/SquareTile.png", CreationCollisionOption.ReplaceExisting);

            ExtendedImage ei = new ExtendedImage();
            byte[] result = new byte[renderTargetBitmap.Pixels.Length * sizeof(int)];
            Buffer.BlockCopy(renderTargetBitmap.Pixels, 0, result, 0, result.Length);
            ei.SetPixels(336,336,result);

            if (ei != null)
            {
                IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
                using (isf)
                {
                    if (!isf.DirectoryExists("Shared")) { isf.CreateDirectory("Shared"); }
                    if (!isf.DirectoryExists("Shared/ShellContent")) { isf.CreateDirectory("Shared/ShellContent"); }
                    if (isf.FileExists(fname)) { isf.DeleteFile(fname); }

                    using (var stream = new IsolatedStorageFileStream(fname, System.IO.FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, isf))
                    {
                        ei.WriteToStream(stream, fname);
                        stream.Close();
                    }
                }
            }
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

}

现在瓷砖看起来像这样(注意背景颜色有一些透明度) enter image description here

如果我在网格中添加相同的UserControl,它实际上看起来像这样 enter image description here

这是此用户控件显示的原始图像

enter image description here

即使图像在那里不透明,您也可以看到红色是如何变成蓝色的。 为什么会这样?

更新 我也尝试了一个不同的图像,只有三种颜色红色蓝色和黄色。结果只有红色和蓝色正在切换。

2 个答案:

答案 0 :(得分:0)

听起来像WriteableBitmap和ExtendedImage期望它们的字节采用不同的格式。可能是BRGA(对于WriteableBitmap)与RGBA(对于ExtendedImage)。

除非您可以在ExtendedImage上指定与WriteableBitmap匹配的顺序,否则您需要调整字节而不是直接复制它们以使颜色正确排列。

答案 1 :(得分:0)

好的,我已经设法使用此功能交换红色和蓝色

private static byte[] convertArray(int[] array)
    {
        byte[] newarray = new byte[array.Length * 4];

        for (int i = 0; i < array.Length; i++)
        {

            newarray[i * 4] = (byte)(array[i] >> 16); 
            newarray[i * 4 + 1] = (byte)(array[i] >> 8); 
            newarray[i * 4 + 2] = (byte)(array[i]); 
            newarray[i * 4 + 3] = (byte)(array[i] >> 24); 

        }
        return newarray;
    }

所以现在我没有使用

Buffer.BlockCopy(renderTargetBitmap.Pixels, 0, result, 0, result.Length);

将WriteableBitmap.Pixels的int []转换为ExtendedImage所需的byte []