从相对路径加载图像

时间:2012-10-25 23:01:09

标签: c# wpf resx

我正在为一个大学项目(学期长)做一个二十一点游戏,我遇到了一个我似乎无法克服的路障。

我正在尝试加载卡片图像,以便它们可以在屏幕上显示,但我一直没有非常这样做。我有绝对的参考资料;我可以从那些加载,但任何从相对路径加载的尝试都会失败。该项目必须是独立的;我无法指示我的教授将这些图像复制到根目录上。

#if FROMDISK
        Uri myUri = new Uri(@"C:\cards\" + getFilename(r, s, "png"), UriKind.Absolute);
        PngBitmapDecoder decoder2 = new PngBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bmp = decoder2.Frames[0];
#else
        System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        Stream myStream = myAssembly.GetManifestResourceStream("Blackjack." + getFilename(r, s, "png"));
        BitmapImage bmp = new BitmapImage();
        bmp.StreamSource = myStream;
#endif
        // Draw the Image
        im.Source = bmp;
        im.Stretch = Stretch.Uniform;
        im.Width = CARD_WIDTH;

(Context)

3 个答案:

答案 0 :(得分:7)

您可以使用:

Uri uri = new Uri(@"FolderName\FileName.png",UriKind.Relative);
PngBitmapDecoder decoder2 = new PngBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

请记住将图像文件的属性设置为(否则编译器将跳过它们)您可以在构建后查看bin / debug文件夹并验证该文件应该位于何处:

  • 构建操作:content
  • 复制到输出目录:始终复制

另一种选择是将文件设为embedded resource,然后您可以像这样访问它:

Bitmap bitmap = Properties.Resources.FileName;

答案 1 :(得分:3)

我喜欢在XAML中将图像声明为资源。我将假设您现在仍然可以使用代码结构,并且希望您没有太多新概念。以下是我的表现方式:

开始在项目中创建名为" Images"的文件夹。通过将卡片的图像拖放到Visual Studio中的文件夹中来添加图像。确保他们的"构建行动"设置为资源。

创建一个新的"资源字典"按CTRL-SHIFT-A。将其命名为CardImages.xaml。

在App.xaml中链接此文件,如下所示(显示如何一次链接多个XAML文件,但为此当然要删除" AnyDictionary"行!)

的App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Controls/CardImages.xaml" />
            <ResourceDictionary Source="Controls/AnyDictionaryYouWant.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

将此代码添加到CardImages.xaml。重命名&#34; MyBlackJackAssembly&#34;到你的项目的大会名称。

<Style TargetType="Image">
    <Setter Property="RenderOptions.BitmapScalingMode" Value="HighQuality" />
</Style>

<DataTemplate x:Key="Spade1">
    <Image Source="MyBlackJackAssembly;component/Images/Spade1.png" />
</DataTemplate>

<DataTemplate x:Key="Spade2">
    <Image Source="MyBlackJackAssembly;component/Images/Spade2.png" />
</DataTemplate>

然后,您可以在代码中找到它们:

Label label = new Label();
label.ContentTemplate = (DataTemplate)label.FindResource("Spade1");

这将为您提供一个应该显示您的卡的WPF Label对象。此技术适用于支持ContentTemplate的任何内容。然后,您可以将您的标签添加到用户界面上的网格中,我不确定您如何在屏幕上显示您的卡片。

对于二十一点应用程序,我可能会创建一个名为&#34; Card&#34;为了能够生成这种类似的东西。这封装了卡片生成&#34;将逻辑转换为自己的控件,以便其余代码可以专注于处理卡片。

XAML:

<myControls:CardImage Kind="Spades" Digit="1" />

或者在c#中这样:

CardImage aCard = new CardImage();
aCard.Kind = CardImage.Kinds.Spades; //enum
aCard.Digit = 1;

答案 2 :(得分:1)

我正在加载一些在项目资源中导入的背景图像:

this.staticBg.Source = new BitmapImage(
    new Uri(@"/Project;component/Images/" + ((App)App.Current).bgImage
                                          + ".jpg", UriKind.Relative));

“项目”是项目名称。 所以基本上你应该将图像添加到资源并用相对的uri调用它们。