如何将URI路径添加到位图图像?

时间:2014-02-21 22:54:21

标签: c# uri overlay filepath bitmapimage

我正在从本地图像文件创建一个位图图像以覆盖另一个位图,但是当指定文件URI时,我得到一个System.UriFormatException我无法理解,因为图像存储在名为Images in的文件夹中这项似乎正确的项目。这就是我指定URI new Uri("Images/boxbag.png")的方式。有人可以解释为什么我得到这种格式异常,这是文件路径的问题还是我设置URI的方式。

这是下面的完整方法,应该澄清更多内容:

void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) {
    using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) {
        if (colorFrame == null) return;
        byte[] colorData = new byte[colorFrame.PixelDataLength];
        colorFrame.CopyPixelDataTo(colorData);

        KinectVideo.Source = BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96,
            PixelFormats.Bgr32, null, colorData, colorFrame.Width * colorFrame.BytesPerPixel);

        //drawing image overlay to video feed
        var drawingVisual = new DrawingVisual();
        var drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawImage(BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Bgr32, null, colorData, colorFrame.Width * colorFrame.BytesPerPixel), 
            new Rect(new Size(colorFrame.Width, colorFrame.Height)));
        var overlayImage = new BitmapImage(new Uri("Images/boxbag.png"));
        drawingContext.DrawImage(overlayImage, new Rect(12, 12, overlayImage.Width, overlayImage.Height));
        drawingContext.Close();
        var mergedImage = new RenderTargetBitmap(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Pbgra32);
        mergedImage.Render(drawingVisual);

        KinectVideo.Source = mergedImage;
    }
}

2 个答案:

答案 0 :(得分:1)

根据http://msdn.microsoft.com/en-us/library/z6c2z492%28v=vs.110%29.aspx

  

此构造函数假定字符串参数引用an   绝对URI,相当于用Uri构造函数调用   UriKind设定为绝对。如果字符串参数传递给   构造函数是一个相对URI,这个构造函数会抛出一个   UriFormatException。

首先,尝试使用绝对路径来查看原则上是否一切正常。

如果有效,您可以尝试查找应用程序路径,例如在System.AppDomain.CurrentDomain.BaseDirectory的帮助下,使用应用程序路径和从应用程序路径到图像的相对路径构建图像的绝对路径。

如下所示:

string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string imageRelativePath = "...";
string imagePath = Path.Combine(baseDirectory, imageRelativePath);

答案 1 :(得分:1)

new Uri("Images/boxbag.png", UriKind.Relative)

否则uri被视为绝对,必须包括方案。