我正在尝试在用户通过Photochooser任务选择的图像上渲染一个字符串。我已经看到了对类似问题的各种回复,但没有一个回复指出它。
这就是我想出的 -
void photochoosertask_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage();
bmp.SetSource(e.ChosenPhoto);
image1.Source = bmp;
string steamer = "SO!";
System.Windows.Media.Imaging.WriteableBitmap bmps = new System.Windows.Media.Imaging.WriteableBitmap(bmp);
RenderString(bmps, steamer);
}
}
private void RenderString(System.Windows.Media.Imaging.WriteableBitmap bitmap, string steamer)
{
textBlock1.Text = steamer;
bitmap.Render(textBlock1 , null);
bitmap.Invalidate();
}
}
但是代码不起作用。我很可能犯了一个重大错误。感谢任何帮助,谢谢!
答案 0 :(得分:0)
如果提供空转换[即你传递的
null
作为第二个参数],表示元素的位显示在相同的偏移处,就好像它们放在它们的父级中一样。
因此,如果我理解正确发生的事情(我可能没有),那么您的textBlock1
元素将使用与父窗体上相同的偏移量进行渲染。因此,textBlock1可能是从顶部和左侧向下,因此它不会显示在您的可写位图中。
BTW,我不熟悉WriteableBitmap
,但你正在做什么(将文本放入UI元素然后将该元素渲染到位图上)似乎是一种向位图添加文本的奇怪方式
答案 1 :(得分:0)
我只是想通了。以为我应该在这里发布解决方案代码,可能会帮助某人 - 有一天:)
//setup a writeable bitmap with required dimensions
System.Windows.Media.Imaging.WriteableBitmap wbmps = new System.Windows.Media.Imaging.WriteableBitmap(x,y);
//set up a transform, we'll use ScaleTransform and we'll keep things simple here, 1x on both the axis
ScaleTransform transform = new System.Windows.Media.ScaleTransform();
transform.ScaleX=1;
transform.ScaleY=1;
//now we need to render the image on the writeablebitmap and follow it up by rendering a //string
wbmps.Render(imageelement,transform);
//Now render the string which is equivalent to TextBlock.Text
wbmps.Render(texblock,transform);
//Finally - redraw the writeablebitmap to complete the rendering
wbmps.Invalidate();