코드에서의 WPF 이미지 소스 설정
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" />
당신과 같은 문제를 안고 몇 가지 읽기를 한 후 해결책인 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;
또는 다른 비트맵 이미지 생성자를 사용하여 다음과 같이 단축할 수 있습니다.
finalImage.Source = new BitmapImage(
new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));
URI는 다음과 같이 분할되어 있습니다.
- 한::
application:///
경로: 참조된 어셈블리로 컴파일되는 리소스 파일의 이름입니다.는 다음과 같은.
AssemblyShortName[;Version][;PublicKey];component/Path
- 어셈블리ShortName: 참조되는 어셈블리의 단축 이름입니다.
- ;Version [ optional ]: 리소스 파일을 포함하는 참조 어셈블리의 버전.이는 동일한 짧은 이름을 가진 두 개 이상의 참조 어셈블리가 로드될 때 사용됩니다.
- ; PublicKey [ optional ]: 참조된 어셈블리에 서명하기 위해 사용된 공용 키.이는 동일한 짧은 이름을 가진 두 개 이상의 참조 어셈블리가 로드될 때 사용됩니다.
- ;component: 참조되는 어셈블리가 로컬 어셈블리에서 참조되도록 지정합니다.
- /Path: 참조된 어셈블리의 프로젝트 폴더 루트에 상대적인 리소스 파일 이름(경로 포함)입니다.
개의 에 오는 .application:
콤마로 대체해야 합니다.
주의: 팩 URI의 권한 컴포넌트는 패키지를 가리키는 삽입 URI로 RFC 2396에 준거해야 합니다.또한 "/" 문자를 " , " 문자로 대체해야 하며 "%" 및 "?"와 같은 예약된 문자를 이스케이프해야 합니다.자세한 것은, OPC 를 참조해 주세요.
이미지 은 반드시 ' 액션'을 '빌드 액션'으로 .Resource
.
var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);
그러면 "Wpf Application 1" 어셈블리의 "Build Action"이 "Resource"로 설정된 "Images" 폴더에 "Untitled.png"라는 이미지가 로드됩니다.
이것은 코드가 조금 적고 한 줄로 실행할 수 있습니다.
string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;
매우 간단:
메뉴 항목의 이미지를 동적으로 설정하려면 다음 작업만 수행하십시오.
MyMenuItem.ImageSource =
new BitmapImage(new Uri("Resource/icon.ico",UriKind.Relative));
...여기서 "icon.ico"는 어디에서나 찾을 수 있으며(현재 "Resources" 디렉토리에 있음), 리소스로 연결되어야 합니다...
가장 간단한 방법:
var uriSource = new Uri("image path here");
image1.Source = new BitmapImage(uriSource);
이게 내 방식이야
internal static class ResourceAccessor
{
public static Uri Get(string resourcePath)
{
var uri = string.Format(
"pack://application:,,,/{0};component/{1}"
, Assembly.GetExecutingAssembly().GetName().Name
, resourcePath
);
return new Uri(uri);
}
}
사용방법:
new BitmapImage(ResourceAccessor.Get("Images/1.png"))
이것을 한 줄로 줄일 수도 있습니다.이것은 메인 창의 아이콘을 설정하는 데 사용한 코드입니다..ico 파일이 Content로 표시되어 출력 디렉토리에 복사되는 것으로 가정합니다.
this.Icon = new BitmapImage(new Uri("Icon.ico", UriKind.Relative));
시도해 보셨습니까?
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
_icon.Source = bitmap;
이미지가 ResourceDictionary에 저장되어 있는 경우 코드 한 줄만 사용하여 이미지를 저장할 수 있습니다.
MyImage.Source = MyImage.FindResource("MyImageKeyDictionary") as ImageSource;
다음으로 이미지 경로를 동적으로 설정하는 예를 나타냅니다(이미지는 리소스로 빌드되지 않고 디스크 상의 어딘가에 배치됩니다).
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
이미지 경로가 있는 문자열에 직접 속성을 지정합니다.그 결과 이미지가 아닌 실제 경로 텍스트가 표시되었습니다!
따라서 아이콘의 이미지를 만들지 않고 기호 글꼴이 있는 텍스트를 사용하여 단순한 "아이콘"을 표시할 수 있습니다.다음 예제에서는 "플로피 디스크" 기호가 포함된 Wingdings 글꼴을 사용합니다.이 심볼이 진짜 캐릭터에요.<
버전 XAML을 <
만 같아★★★★★★★★★★★★★★★★★★★!다음은 플로피 디스크 기호를 메뉴 항목의 아이콘으로 보여 줍니다.
<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
<MenuItem.Icon>
<Label VerticalAlignment="Center" HorizontalAlignment="Center" FontFamily="Wingdings"><</Label>
</MenuItem.Icon>
</MenuItem>
더 간단한 방법도 있습니다.이미지가 XAML의 리소스로 로드되어 문제의 코드가 해당 XAML 콘텐츠의 코드 배후에 있는 경우:
Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute);
NotifyIcon.Icon = BitmapFrame.Create(iconUri);
프레임을 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 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" };
더 간단한 방법도 있습니다.이미지가 XAML의 리소스로 로드되어 문제의 코드가 해당 XAML의 코드 배후에 있는 경우:
다음은 XAML 파일용 리소스 딕셔너리입니다.주의할 행은 "PosterBrush" 키가 있는 ImageBrush뿐입니다.그 외의 코드는 컨텍스트를 표시하는 것입니다.
<UserControl.Resources>
<ResourceDictionary>
<ImageBrush x:Key="PosterBrush" ImageSource="..\Resources\Images\EmptyPoster.jpg" Stretch="UniformToFill"/>
</ResourceDictionary>
</UserControl.Resources>
뒤에 있는 코드에서는 이렇게 하면 됩니다.
ImageBrush posterBrush = (ImageBrush)Resources["PosterBrush"];
리소스 아이콘 및 이미지에 포함된 이미지를 로드하는 방법(Arcturus 수정 버전):
이미지가 있는 버튼을 추가한다고 가정합니다.어떻게 해야 할까요?
- 프로젝트 폴더 아이콘에 추가 및 이미지 Click Me.png 여기에 추가
- 'ClickMe.png' 속성에서 'BuildAction'을 'Resource'로 설정합니다.
- 컴파일된 어셈블리 이름이 '회사'라고 가정합니다.Product Assembly.dll'을 클릭합니다.
이제 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>
다 했어요.
WPF는 처음이지만,는 아닙니다.그물.
의 "WPF Custom Control Library Project"에 PNG 파일을 추가하려고5시간 걸렸어요NET 3.5(Visual Studio 2010) 및 이미지 상속 컨트롤의 배경으로 설정합니다.
URI와 관련된 것은 아무것도 동작하지 않았다.리소스 파일에서 IntelliSense를 통해 URI를 가져오는 방법이 없는 이유를 알 수 없습니다.
Properties.Resources.ResourceManager.GetURI("my_image");
저는 많은 URI를 시도하고 Resource Manager와 Assembly의 GetManifest 메서드를 사용해봤지만 예외나 NULL 값이 있었습니다.
여기에 나에게 효과가 있었던 코드를 저장해 두었습니다.
// Convert the image in resources to a Stream
Stream ms = new MemoryStream()
Properties.Resources.MyImage.Save(ms, ImageFormat.Png);
// Create a BitmapImage with the stream.
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = ms;
bitmap.EndInit();
// Set as source
Source = bitmap;
조금 빗나갔을 뿐이에요.
어셈블리에서 임베디드 리소스를 가져오려면 여기서 설명한 바와 같이 어셈블리 이름과 파일 이름을 함께 지정해야 합니다.
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream(asm.GetName().Name + "." + "Desert.jpg");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
image1.Source = bitmap;
이미 스트림이 있고 형식을 알고 있는 경우 다음과 같은 방법을 사용할 수 있습니다.
static ImageSource PngStreamToImageSource (Stream pngStream) {
var decoder = new PngBitmapDecoder(pngStream,
BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
return decoder.Frames[0];
}
실행 파일 옆에 있는 파일(실행 파일과 상대적인 파일)을 찾으려면 다음과 같이 하십시오.
img.Source = new BitmapImage(new Uri(AppDomain.CurrentDomain.BaseDirectory + @"\Images\image.jpg", UriKind.Absolute));
강제 선택한 UriKind가 올바릅니다.
Image.Source = new BitmapImage(new Uri("Resources/processed.png", UriKind.Relative));
UriKind 옵션:
UriKind.Relative // relative path
UriKind.Absolute // exactly path
언급URL : https://stackoverflow.com/questions/350027/setting-wpf-image-source-in-code
'bestsource' 카테고리의 다른 글
Git에서 오래된 커밋을 태그하는 방법은? (0) | 2023.04.14 |
---|---|
Windows에 가장 적합한 무료 C++ 프로파일러는 무엇입니까? (0) | 2023.04.14 |
Groovy Shell 경고 "prefs 루트 노드를 열거나 만들 수 없습니다..." (0) | 2023.04.14 |
Panda를 사용하여 여러 헤더가 포함된 엑셀 시트 읽기 (0) | 2023.04.14 |
유전확장 변수를 피하는 방법은? (0) | 2023.04.14 |