.net image - 在代碼中設置WPF圖像源




source xaml (15)

我試圖在代碼中設置WPF圖像的源代碼。 該圖像作為資源嵌入到項目中。 通過查看示例,我已經提出了下面的代碼。 由於某種原因,它不起作用 - 圖像不顯示。

通過調試,我可以看到該流包含圖像數據。 那麼,怎麼了?

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;

圖標的定義如下: <Image x:Name="_icon" Width="16" Height="16" />


Answers

好簡單:

要動態設置菜單項的圖像,只需執行以下操作:

MyMenuItem.ImageSource = 
    new BitmapImage(new Uri("Resource/icon.ico",UriKind.Relative));

...而“icon.ico”可以位於任何地方(目前它位於“資源”目錄中),並且必須鏈接為資源...


你有沒有嘗試過:

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
_icon.Source = bitmap;

如果你已經有一個流,並知道格式,你可以使用這樣的東西:

static ImageSource PngStreamToImageSource (Stream pngStream) {
    var decoder = new PngBitmapDecoder(pngStream,
        BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    return decoder.Frames[0];
}

你也可以把它減少到一行。 這是我用來為我的主窗口設置圖標的代碼。 它假定.ico文件被標記為內容並被複製到輸出目錄。

 this.Icon = new BitmapImage(new Uri("Icon.ico", UriKind.Relative));

這是我的方式

internal static class ResourceAccessor
{
    public static Uri Get(string respurcePath)
    {
        var uri = string.Format(
            "pack://application:,,,/{0};component/{1}"
            , Assembly.GetExecutingAssembly().GetName().Name
            , respurcePath
        );

        return new Uri(uri);
    }
}

用途:

new BitmapImage(ResourceAccessor.Get("Images/1.png"))

以下是一個動態設置圖像路徑的示例(圖像位於光盤的某處,而不是作為資源構建):

if (File.Exists(imagePath))
{
 // Create image element to set as icon on the menu element
 Image icon = new Image();
 BitmapImage bmImage = new BitmapImage();
 bmImage.BeginInit();
 bmImage.UriSource = new Uri(imagePath, UriKind.Absolute);
 bmImage.EndInit();
 icon.Source = bmImage;
 icon.MaxWidth = 25;
 item.Icon = icon;
}

思考圖標...

首先想到的是,你會認為Icon屬性只能包含圖像。 但它實際上可以包含任何東西! 當我以編程方式嘗試將Image屬性直接設置為具有圖像路徑的字符串時,我意外發現了這一點。 結果是它沒有顯示圖像,但是路徑的實際文本!

這導致替代方案不必為圖標製作圖像,而是使用帶有符號字體的文本代替顯示簡單的“圖標”。 以下示例使用包含“floppydisk”符號的Wingdings字體。 該符號實際上是XAML中具有特殊含義的字符< ,因此我們必須使用編碼版本&lt; 代替。 這像夢一樣運作! 下面在菜單項上顯示一個floppydisk符號作為圖標:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

將框架置於VisualBrush中:

VisualBrush brush = new VisualBrush { TileMode = TileMode.None };


brush.Visual = frame;

brush.AlignmentX = AlignmentX.Center;
brush.AlignmentY = AlignmentY.Center;
brush.Stretch = Stretch.Uniform;

將VisualBrush放入GeometryDrawing中

GeometryDrawing drawing = new GeometryDrawing();

drawing.Brush = brush;

//Brush this in 1, 1 ratio
RectangleGeometry rect = new RectangleGeometry { Rect = new Rect(0, 0, 1, 1) };
drawing.Geometry = rect;

現在把GeometryDrawing放在一個DrawingImage中:

new DrawingImage(drawing);

把它放在你的圖像源上,等等!

你可以做得更容易,但是:

<Image>
    <Image.Source>
        <BitmapImage UriSource="/yourassembly;component/YourImage.PNG"></BitmapImage>
    </Image.Source>
</Image>

在代碼中:

BitmapImage image = new BitmapImage {UriSource =“/ yourassembly; component / YourImage.PNG”};

HTH


最簡單的方法:

var uriSource = new Uri("image path here");
image1.Source = new BitmapImage(uriSource);

玩的開心 :)


這是少一點的代碼,可以在一行中完成。

string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;

如果您的圖像存儲在ResourceDictionary中,則只需要一行代碼即可完成:

MyImage.Source = MyImage.FindResource("MyImageKeyDictionary") as ImageSource;

在遇到同樣的問題並做了一些閱讀之後,我發現了解決方案 - Pack URIs

我在代碼中做了以下操作:

Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;

或者更短,通過使用另一個BitmapImage構造函數:

finalImage.Source = new BitmapImage(
    new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));

URI分成幾部分:

  • 權限: application:///
  • 路徑:編譯為引用程序集的資源文件的名稱。 該路徑必須符合以下格式: AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName:引用程序集的簡稱。
    • ;版本[可選]:包含資源文件的引用程序集版本。 當兩個或多個具有相同短名稱的引用程序集被加載時使用。
    • ; PublicKey [可選]:用於簽署引用程序集的公鑰。 當兩個或多個具有相同短名稱的引用程序集被加載時使用。
    • ; component:指定被引用的程序集是從本地程序集引用的。
    • /路徑:資源文件的名稱,包括其路徑,相對於引用程序集項目文件夾的根目錄。

application:後的三個斜杠application:必須用逗號代替:

注意:pack URI的權威組件是一個嵌入的URI,指向一個包並且必須符合RFC 2396.此外,“/”字符必須替換為“,”字符和保留字符,如“%”和“?” 必須逃脫。 有關詳細信息,請參閱OPC。

當然,確保您將圖像上的構建操作設置為Resource


var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);

這會在名為“WpfApplication1”的程序集中將其“Build Action”設置為“Resource”的名為“Images”的文件夾中加載名為“Untitled.png”的圖像。


如何從嵌入資源圖標和圖像中加載圖像(Arcturus的更正版本)

假設你想添加按鈕與圖像。 你該怎麼辦?
1.添加到項目文件夾圖標,並放在這裡圖片ClickMe.png
2.在'ClickMe.png'屬性中將'BuildAction'設置為'Resource'
假設你編譯的程序集名稱是'Company.ProductAssembly.dll'
4.現在是時候在Xaml中加載我們的圖像了

<Button Width="200" Height="70">
  <Button.Content>
    <StackPanel>
      <Image Width="20" Height="20">
        <Image.Source>
          <BitmapImage UriSource="/Company.ProductAssembly;component/Icons/ClickMe.png"></BitmapImage>
          </Image.Source>
      </Image>
      <TextBlock HorizontalAlignment="Center">Click me!</TextBlock>
    </StackPanel>
  </Button.Content>
</Button>

DONE


還有一種更簡單的方法,如果圖像在xaml中作為資源加載,並且所討論的代碼是該xaml的代碼隱藏

Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute);
NotifyIcon.Icon = BitmapFrame.Create(iconUri);

關心Bharat Thanki


對於那些登陸這篇文章並且對更現代的解決方案感興趣並且不需要支持舊版瀏覽器的人,您可以這樣做:

.frame {
    display: flex;
    /*Uncomment below to center horizontally*/
    /*justify-content: center;*/
    align-items: center;
}

img {
    height: auto;
}

/* Styling stuff not needed for demo */
.frame {
    max-width: 900px;
    height: 200px;
    margin: auto;
    background: #222;
}
p {
    max-width: 900px;
    margin: 20px auto 0;
}
img {
    width: 150px;
}
<div class="frame">
    <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/9988/hand-pointing.png">
</div>

這是一支筆: http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3ehttp://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e







.net wpf image