質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1432閲覧

[Xamarin]pngイメージの縦横幅取得とバイナリ化を行いたい

JpTomari

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2021/06/08 20:14

編集2021/06/10 03:12

実現したいこと

png画像を共有プロジェクトに埋め込みリソースとして導入しました。
この画像をC#のプログラムソースのみで読み込みを行い、縦横幅の取得とバイナリ化を行いたいと考えております。

該当のソースコード

プログラムソースは以下の形となっております。

C#

1 //=================================================== 2 // テスト画像のリソースID 3 //=================================================== 4 private String[] ImageList = 5 { 6 "ShikonMulti.Resources.Image.button_red.png", 7 }; 8 9 //=================================================== 10 // 画像読み込み 11 //=================================================== 12 public void ReadImage() 13 { 14 int i, len; 15 16 byte[] array; 17 byte[][] image = null; 18 int[,] size = null; 19 20 Image temp; 21 Assembly asm; 22 ImageSource src; 23 ImageConverter ic = new ImageConverter(); 24 25 len = ImageList.Length; 26 image = new byte[len][]; 27 size = new int[len, (int)Def.XY]; 28 29 for (i = 0; i < len; i++) 30 { 31 asm = Assembly.GetExecutingAssembly(); 32 src = ImageSource.FromResource(ImageList[i], asm); 33 temp = new Image { Source = src }; 34 size[i, (int)Def.X] = (int)temp.Width; 35 size[i, (int)Def.Y] = (int)temp.Height; 36 37 array = (byte[])ic.ConvertTo(temp, typeof(byte[])); 38 image[i] = array; 39 } 40 } 41

※『Def.X』はint値の1、『Def.Y』はint値の1、『Def.XY』はint値の2となります。

イメージを格納しているフォルダの構成は以下の形です。

フォルダ構成

※画像button_red.pngの縦横幅は128x128です。

試したこと

実行したところ、temp.Width、temp.Heightは-1を返してきます。
その状態でImageConverter.ConvetToを実行すると、System.InvalidCastExceptionが発生します。

リソースIDを色々と変えてみたのですが、temp.Width、temp.Heightの値は-1のままでした。
System.InvalidCastExceptionも同様に発生します。

srcについては、リソースIDの内容に関わらず、nullではなく何らかのImageSourceの参照が入っていることは確認しました。
また、asmはメインのAssemblyである、ShikonMulti.dllを取得できています。

20210610:追記
リソースIDそれ自体は正しいのではないかと判断しています。
また、ImageConverter.CanConvaertTo(typeof(byte[]))についてはtrueを返していることが確認できました。

お尋ねしたいこと

上記の状態において、リソースIDは正しく指定されておりますでしょうか?

また、縦横幅の取得方法とバイナリ化の手段に何か問題はありますでしょうか?

何かお気付きの点などありましたらご指摘をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答者からはどこまで正しく動いてるか知る術はないので、まず自身でデバッグして原因を切り分けて頂くしかないかと。
・リソースの名前が正しいか
・実際にリソースの名前を指定してファイルの中身を取り出せるか
・リソース以外の方法で同一ファイルを読み込めるか(ファイル指定、Stream指定など)
とりあえずGetManifestResourceNamesで、名前を確認する所から始めてみてはどうでしょう。
埋め込まれているリソースの名前を取得する

投稿2021/06/11 00:53

編集2021/06/11 01:08
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JpTomari

2021/06/11 05:16

ご助言ありがとうございます。 ご指摘のあったGetMaifestNamesを利用して、格納されているファイルを確認したところ、確かに格納されていることが確認できました。 そこでGetManifestResourceStreamを利用し、直接バイナリデータを取得するよう処理を変更して問題を回避し、画像の縦横幅はバイナリから画像データを生成して取得するように修正しましたので、望んでいた実装は一通り成功と言う形になりました。 今回は質問する側のこちらの方が『聞きたいこと』をまとめきれていなかった部分がございました。 そんな中、ヒントになるご助言をくださったradianさまには深く感謝いたします。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問