所以我试图保存一个用户控件的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;
}
}
}
现在瓷砖看起来像这样(注意背景颜色有一些透明度)
如果我在网格中添加相同的UserControl,它实际上看起来像这样
这是此用户控件显示的原始图像
即使图像在那里不透明,您也可以看到红色是如何变成蓝色的。 为什么会这样?
更新 我也尝试了一个不同的图像,只有三种颜色红色蓝色和黄色。结果只有红色和蓝色正在切换。
答案 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 []