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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

11820閲覧

外部のBMPファイルをUnityで読み込みたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2015/08/28 12:10

編集2015/08/28 13:20

UnityでBMP画像ファイルを外部から読み込んで描画する方法を知りたいです。調べてみたところWWWクラスのtextureではBMP形式はサポートされていないようなので、おそらくbyte型配列?を利用して読み込む方法しかないと思うのですが・・・この辺りの知識については全くの素人なので、手がかりがつかめないという状況です。具体的なやり方でなくとも、参考になる情報等があれば教えていただきたいです。

追記:環境はMac、Unity5を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一部のBMP形式だけですが、画像を表示できたので書いておきます。

C#

1// TextureLoader.cs 2using UnityEngine; 3using System.Collections; 4using System.IO; 5using System; 6 7//typedef struct tagBITMAPFILEHEADER {全14Byte 8// WORD bfType; 2Byte 9// DWORD bfSize; 4Byte 10// WORD bfReserved1; 2Byte 11// WORD bfReserved2; 2Byte 12// DWORD bfOffBits; 4Byte 13//} BITMAPFILEHEADER; 14public struct BITMAPFILEHEADER { 15 public ushort bfType; // ファイルタイプ 16 public uint bfSize; // ファイル全体のサイズ 17 public ushort bfReserved1; // 予約領域 18 public ushort bfReserved2; // 予約領域2 19 public uint bfOffBits; // ファイルの先頭から画像データまでのオフセット数 20} 21 22//typedef struct tagBITMAPINFOHEADER{ 全40Byte 23// DWORD biSize; 4Byte 24// LONG biWidth; 4Byte 25// LONG biHeight; 4Byte 26// WORD biPlanes; 2Byte 27// WORD biBitCount; 2Byte 28// DWORD biCompression; 4Byte 29// DWORD biSizeImage; 4Byte 30// LONG biXPelsPerMeter; 4Byte 31// LONG biYPelsPerMeter; 4Byte 32// DWORD biClrUsed; 4Byte 33// DWORD biClrImportant; 4Byte 34//} BITMAPINFOHEADER; 35public struct BITMAPINFOHEADER { 36 public uint biSize; // BITMAPINFOHEADERのサイズ(40) 37 public int biWidth; // ビットマップの幅 38 public int biHeight; // ビットマップの高さ 39 public ushort biPlanes; // プレーン数(常に1) 40 public ushort biBitCount; // 1ピクセルあたりのビット数(1, 4, 8, 16, 24, 32) 41 public uint biCompression; // 圧縮形式 42 public uint biSizeImage; // イメージのサイズ(バイト数) 43 public int biXPelsPerMeter; // ビットマップの水平解像度 44 public int biYPelsPerMeter; // ビットマップの垂直解像度 45 public uint biClrUsed; // カラーパレット数 46 public uint biClrImportant; // 重要なカラーパレットのインデックス 47} 48 49// 画像を読み込んでテクスチャに変換するクラス 50public class TextureLoader { 51 52 // 画像をファイルパスから読み込んで、テクスチャを返す 53 public static Texture2D LoadImage(string filePath) { 54 55 // 拡張子の確認 56 string ext = Path.GetExtension(filePath); 57 58 if(ext == ".bmp") { 59 // BMPファイルの場合 60 61 // ファイルを開く 62 FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read); 63 64 // データ 65 byte[] readData = new byte[4]; 66 67 /* BITMAPFILEHEADERの読みこみ */ 68 BITMAPFILEHEADER bfh; 69 70 // bfType 71 fs.Read(readData, 0, 2); 72 bfh.bfType = BitConverter.ToUInt16(readData, 0); 73 74 // bfSize 75 fs.Read(readData, 0, 4); 76 bfh.bfSize = BitConverter.ToUInt32(readData, 0); 77 // bfReserved1 78 fs.Read(readData, 0, 2); 79 bfh.bfReserved1 = BitConverter.ToUInt16(readData, 0); 80 // bfReserved2 81 fs.Read(readData, 0, 2); 82 bfh.bfReserved2 = BitConverter.ToUInt16(readData, 0); 83 // bfOffBits 84 fs.Read(readData, 0, 4); 85 bfh.bfOffBits = BitConverter.ToUInt32(readData, 0); 86 87 /* BITMAPINFOHEADERの読み込み */ 88 BITMAPINFOHEADER bih; 89 90 // biSize 91 fs.Read(readData, 0, 4); 92 bih.biSize = BitConverter.ToUInt32(readData, 0); 93 // biWidth 94 fs.Read(readData, 0, 4); 95 bih.biWidth = BitConverter.ToInt32(readData, 0); 96 // biHeight 97 fs.Read(readData, 0, 4); 98 bih.biHeight = BitConverter.ToInt32(readData, 0); 99 // biPlanes 100 fs.Read(readData, 0, 2); 101 bih.biPlanes = BitConverter.ToUInt16(readData, 0); 102 //biBitCount 103 fs.Read(readData, 0, 2); 104 bih.biBitCount = BitConverter.ToUInt16(readData, 0); 105 // biCompression 106 fs.Read(readData, 0, 4); 107 bih.biCompression = BitConverter.ToUInt32(readData, 0); 108 // biSizeImage 109 fs.Read(readData, 0, 4); 110 bih.biSizeImage = BitConverter.ToUInt32(readData, 0); 111 // biXPelsPerMeter 112 fs.Read(readData, 0, 4); 113 bih.biXPelsPerMeter = BitConverter.ToInt32(readData, 0); 114 // biYPelsPerMeter 115 fs.Read(readData, 0, 4); 116 bih.biYPelsPerMeter = BitConverter.ToInt32(readData, 0); 117 // biClrUsed 118 fs.Read(readData, 0, 4); 119 bih.biClrUsed = BitConverter.ToUInt32(readData, 0); 120 // biClrImportant 121 fs.Read(readData, 0, 4); 122 bih.biClrImportant = BitConverter.ToUInt32(readData, 0); 123 124 /* 画像データの読みこみ */ 125 126 // 24bitでなければキャンセル 127 if(bih.biBitCount != 24) { 128 Debug.Log (bih.biBitCount + " bit is not supported"); 129 return null; 130 } 131 132 // テクスチャを作成 133 Texture2D texture = new Texture2D(bih.biWidth, bih.biHeight); 134 135 // 1ラインあたりのデータ数を計算 136 int line = bih.biWidth * bih.biBitCount / 8; 137 if((line % 4) != 0) { 138 // データ数が4の倍数でなければ4の倍数に合わせる 139 line = ((line / 4) + 1) * 4; 140 } 141 142 // データを左下から1行ずつ読み込む 143 byte[] lineData = new byte[line]; 144 for(int y=0; y<bih.biHeight; y++) { 145 fs.Read (lineData, 0, line); 146 147 // 1画素分ずつ取り出す 148 for(int x=0; x<bih.biWidth; x++) { 149 byte B = lineData [x * 3]; 150 byte G = lineData [x * 3 + 1]; 151 byte R = lineData [x * 3 + 2]; 152 153 // カラーデータを作成 154 Color color = new Color32 (R, G, B, 255); 155 156 // データをテクスチャにセット 157 texture.SetPixel(x, y, color); 158 } 159 } 160 161 // データを適用 162 texture.Apply(); 163 164 // 終了処理 165 fs.Close(); 166 fs.Dispose (); 167 168 return texture; 169 170 } else { 171 // png, jpegの場合 172 Debug.Log("not bmp image"); 173 return null; 174 } 175 176 } 177} 178

C#

1// Test.cs 2// GameObjectにアタッチさせる 3using UnityEngine; 4using System.Collections; 5 6public class Test : MonoBehaviour { 7 8 // 表示用 9 public GameObject renderer; 10 11 // Use this for initialization 12 void Start () { 13 string filePath = "/Users/usr/Desktop/b.bmp"; 14 Texture2D t = TextureLoader.LoadImage (filePath); 15 Sprite s = Sprite.Create (t, new Rect (0, 0, t.width, t.height), new Vector2 (0.5f, 0.5f), 1.0f); 16 renderer.GetComponent<SpriteRenderer> ().sprite = s; 17 } 18 19 // Update is called once per frame 20 void Update () { 21 22 } 23} 24

BMPデータからピクセルデータを1つ1つ読み取り、同じ大きさのテクスチャに1つずつコピーする、というとてもアナログな方法ですが、他にやり方を思いつきませんでした。
BMPの読み込み自体はSystem.DrawingのBitmapクラスを使うと簡単にできるのですが、Macでこのクラスを使うのに必要なSystem.Drawing.dllとlibgdiplus.dylibがUnity側で認識してくれないので、byte配列から読み込む方法を採りました。
(MacでSystem.Drawingが使えないことについてはhttp://answers.unity3d.com/questions/158983/how-do-you-load-systemdrawingdll-and-gdiplusdll-on.htmlや他のいろいろなサイトでも質問されていますが、解決したところは1つも見つけられませんでした。)

BMPの規格についてはこちらのサイトが参考になりました。
http://www.kk.iij4u.or.jp/~kondo/bmp/
実際のコードの書き方についてはこちらのサイトがとても役に立ちました。
http://imagingsolution.blog107.fc2.com/blog-entry-254.html

BMPには色々な種類があるのですが、ここではとりあえず24bit形式のものにだけ対応しています。BMPの種類は

C#

1// 24bitでなければキャンセル 2if(bih.biBitCount != 24) { 3 Debug.Log (bih.biBitCount + " bit is not supported"); 4 return null; 5}

で判断しています。他の形式にも対応するならbih.biBitCountの値で処理を変える必要があります。1, 4, 8bitならカラーパレットにも対応させないといけませんのでさらに面倒になります。

結局のところ、Mac上のUnityでBMPを読み込むには、BMP形式がそもそもどうなっているのかというレベルまで知っていないとできないようです。OSがWindows限定ならおそらくBitmapクラスが使えるのでBMP形式を知らなくても簡単にできると思いますが・・・できればUnity側で対応してほしいものです。

投稿2015/09/27 07:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問