XamarinでiOSアプリを作っています。
メインのプロジェクトAから共有プロジェクトBにある画像リソースを参照する方法はあるでしょうか?
Bの直下
Imagesディレクトリ内
- 1.png
- 2.png
Aから下記のようにしてもnullになってしまいます(恐らく自分のプロジェクトを見に行っている)
c#
1UIImage image = UIImage.FromFile("Images/1.png"); // nullになってしまう
Xamarin.iOSですが、VisualStudioやC#寄りの質問かなと思ってタグに追記しています。
◆目的
・Xamarin.iOSのプロジェクトとWindowsFormのプロジェクトから共通プロジェクト内にある画像を読み込みたい。
・画像はファイル実体にアクセスではなくResources内にある埋め込みされたファイルアクセスのように扱いたい。
◆環境
Visual Studio 2019
Xamarin 16.1
Xamarin.iOS 12.10
実機iPadのiOS 12.3
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ちょうど今書いていたので私の実装をさらします。
C#
1public sealed class Images 2{ 3 /// <summary> 4 /// 埋め込みリソースからBitmapImageを取得 5 /// </summary> 6 /// <param name="resourceName">埋め込みリソース名</param> 7 /// <param name="nameSpace">名前空間</param> 8 /// <returns></returns> 9 private static BitmapImage GetBitmapImage(string resourceName, 10 string nameSpace = "Hogehoge.Infrastructures.Images") 11 { 12 var image = new BitmapImage(); 13 14 image.BeginInit(); 15 image.StreamSource = Assy.GetManifestResourceStream($"{nameSpace}.{resourceName}"); 16 image.CacheOption = BitmapCacheOption.OnLoad; 17 image.EndInit(); 18 19 return image; 20 } 21 22 private static Assembly Assy { get; } = 23 Assembly.GetExecutingAssembly(); 24 25 public static BitmapImage Order { get; } = 26 GetBitmapImage("order128.png"); 27 28 public static BitmapImage Production { get; } = 29 GetBitmapImage("production128.png"); 30 31 public static BitmapImage Shipment { get; } = 32 GetBitmapImage("shipment128.png"); 33 34 public static BitmapImage Receipt { get; } = 35 GetBitmapImage("receipt128.png"); 36 37 public static BitmapImage Return { get; } = 38 GetBitmapImage("return128.png"); 39 40 public static BitmapImage Sale { get; } = 41 GetBitmapImage("sale128.png"); 42 43 public static BitmapImage Invoice { get; } = 44 GetBitmapImage("invoice128.png"); 45 46 public static BitmapImage Payment { get; } = 47 GetBitmapImage("payment128.png"); 48}
投稿2019/07/04 01:29
総合スコア4150
0
ベストアンサー
試しにプロジェクト作ってみました。
https://github.com/amay077/ImageRefSample
共有プロジェクトが ImageRefSample
という名前で、その中に myprof.png
が 埋め込みリソース として追加されているという前提で、アプリ側のコードは次のようになります。
csharp
1// 他のプロジェクトにある型からアセンブリを取得 2var assembly = typeof(MyClass).GetTypeInfo().Assembly; 3 4// 一応埋め込みリソースをリストアップ 5foreach (var res in assembly.GetManifestResourceNames()) 6{ 7 System.Diagnostics.Debug.WriteLine("found resource: " + res); 8} 9 10// ImageRefSample プロジェクトの myprof.png を読み込み 11using (var stream = assembly.GetManifestResourceStream("ImageRefSample.myprof.png")) 12{ 13 var imageData = Foundation.NSData.FromStream(stream); 14 var image = UIImage.LoadFromData(imageData); 15 16 image1.Image = image; 17}
端的に言えば、
typeof(<共有プロジェクトにあるクラス>).GetTypeInfo().Assembly.GetManifestResourceStream("<共有プロジェクト名.画像ファイル名>")
で、画像データを Stream として読み出せるので、後はプラットフォーム側でよしなに利用するだけです。
投稿2019/07/03 07:54
総合スコア1075
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
共有プロジェクトBの画像のプロパティに定義されているビルドアクションを「埋め込まれたリソース」に変えて、そこのリソースにプロジェクトAがアクセスするという手段はいかがでしょうか。
デバッグはしていませんが、イメージとしては下記のようなコードです。
C#
1var projectBAssembly = AppDomain.CurrentDomain.GetAssemblies(). 2 SingleOrDefault(assembly => assembly.GetName().Name == "プロジェクトB"); 3var stream = projectBAssembly.GetManifestResourceStream("Images/1.png"); 4var imageData = NSData.FromStream(stream); 5 6UIImage image = UIImage.LoadFromData(imageData);
参考:
https://dobon.net/vb/dotnet/programing/bitmapresource.html
https://stackoverflow.com/questions/43995539/how-to-convert-stream-to-uiimage-in-xamarin-ios
追記:
参考URLにもありますが、stream
やimageData
、image
などはIDisposable
なオブジェクトなのでusing
を使うか明示的にDispose
メソッドを呼んでリソースの破棄を忘れないようにしてください。
投稿2019/07/03 03:34
編集2019/07/03 06:21総合スコア2663
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/03 04:15 編集
2019/07/03 04:15
2019/07/03 04:16
2019/07/03 04:22
2019/07/03 04:38 編集
2019/07/03 04:45 編集
2019/07/03 05:28
2019/07/03 06:25
0
フルパスで指定してやればいいのでは。
投稿2019/07/03 02:35
総合スコア87719
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/03 02:38
2019/07/03 02:41
2019/07/03 03:07
2019/07/03 03:12
2019/07/03 03:17
2019/07/03 03:20
2019/07/03 03:28
2019/07/03 03:30
2019/07/03 03:36
2019/07/03 03:39
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/04 03:52