WriteableBitmap问题 满分求解
我现在有个需求需要把两张大图片合成一张大图片然后根据需求剪切大图成小图:
代码贴下:
WriteableBitmap writeableBitmap = new WriteableBitmap(5100, 1200);
public MainPage()
{
InitializeComponent();
Equipment[0] = 0;
Equipment[1] = 1;
img1.Visibility = Visibility.Collapsed;
img2.Visibility = Visibility.Collapsed;
bi = new BitmapImage(new Uri(@"Images/Body0.png", UriKind.Relative));
bi.ImageOpened += new EventHandler<RoutedEventArgs>(bi_ImageOpened);
//使用一下才会触发ImageOpened事件
img1.Source = bi;
LayoutRoot.Children.Add(img1);
}
Image img1 = new Image();
Image img2 = new Image();
BitmapImage bi;
void bi_ImageOpened(object sender, RoutedEventArgs e)
{
img1.Source = sender as BitmapImage;
writeableBitmap.Render(img1, null);
BitmapImage bi1 = new BitmapImage(new Uri(@"Images/Weapon1.png", UriKind.Relative));
bi1.ImageOpened += new EventHandler<RoutedEventArgs>(bi1_ImageOpened);
img2.Source = bi1;
this.LayoutRoot.Children.Add(img2);
}
Image img = new Image();
void bi1_ImageOpened(object sender, RoutedEventArgs e)
{
img2.Source = sender as BitmapImage;
writeableBitmap.Render(img2, null);
writeableBitmap.Invalidate();
this.img.ImageOpened += new EventHandler<RoutedEventArgs>(img_ImageOpened);
this.img.Source = writeableBitmap;
}
由于要使用WriteableBitmap需要再ImageOpened事件中使用
好,现在我的大图顺利合成成功
定义一个剪切方法
public ImageSource[,] EquipPart(int[] Equipment, int rowNum, int colNum, int singleWidth, int singleHeight)
{
//Equipment[0]为衣服代号,Equipment[1]为武器代号,本例中装备只由衣服+武器组成
//假如内存中没有该装备的角色现成图片源则进行读取
if (PartImage[Equipment[0], Equipment[1]] == null)
{
ImageSource[,] bitmap = new ImageSource[rowNum, colNum];
for (int i = 0; i < rowNum; i++)
{
for (int j = 0; j < colNum; j++)
{
WriteableBitmap wb1 = new WriteableBitmap(singleWidth, singleHeight);
wb1.Render(this.img, new TranslateTransform() { X = -1 * j * singleWidth, Y = -1 * i * singleHeight });
wb1.Invalidate();
bitmap[i, j] = (ImageSource)wb1;
}
}
}
到现在都没有问题
问题出来了
void bi1_ImageOpened(object sender, RoutedEventArgs e)
{
img2.Source = sender as BitmapImage;
writeableBitmap.Render(img2, null);
writeableBitmap.Invalidate();
this.img.ImageOpened += new EventHandler<RoutedEventArgs>(img_ImageOpened);
this.img.Source = writeableBitmap;
EquipPart(Equipment, 8, 34, 150, 150);
}
此时我得到的 bitmap 全部为空图片
思考了好久我猜测错误原因在于 此时的
this.img.Source = writeableBitmap;
这句代码img可能没有真正的加载成功
此时我定义了
this.img.ImageOpened += new EventHandler<RoutedEventArgs>(img_ImageOpened);事件
这个事件只有在下载解析图片的时候才触发 此时我的大图已经在内存中了 所以这个事件 不触发
做了一个另外的试验 我剪切图片放在一个按钮中
private void Button_Click(object sender, RoutedEventArgs e)
{
EquipPart(Equipment, 8, 34, 150, 150);
//此时的bitmap全为成功
}
我现在的需求是一次性执行成功而不是要按钮去实现