トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_script_texture2d_save_png_file

Texture2Dをpngとしてファイル保存


Texture2Dをpngに変換」の処理の後、そのままファイルに保存します。
pngに変換するにはTexture2DのTextureFormatが RGBA32/ARGB32/RGB24、である必要があります。

ファイル保存時に、ファイルダイアログを出すようにします。
また、ファイルダイアログを出す機能はiOS/androidでは動作せず、PCのみの機能になります。

要 : using UnityEditor;
     using System.IO;

Texture2D tex = なにかテクスチャ.
byte [] pngData = tex.EncodeToPNG();   // pngのバイト情報を取得.

// ファイルダイアログの表示.
string filePath = EditorUtility.SaveFilePanel("Save Texture", "", tex.name + ".png", "png");

if (filePath.Length > 0) {
  // pngファイル保存.
  File.WriteAllBytes(filePath, pngData);
}

EditorUtility.SaveFilePanelの第一引数はダイアログのタイトル、第二引数ははじめに開くパス、第三引数にデフォルトのファイル名、第四引数は拡張子。
第二引数のパスは、Unityのプロジェクトが存在するフォルダになります。
「Assets」とすると、Assetsフォルダ内がダイアログで開かれます。

「File.WriteAllBytes」関数で、第一引数で指定されたパスに対して、第二引数のバイトデータを書き込みます。
これでpngファイルとして保存できます。

 メモリリークを防ぐ


この「File.WriteAllBytes」でpngファイルとして画像を出力する際にAssetsディレクトリ内で保存した場合、メモリ上のTexture2Dと再読み込みされる出力後のpngファイルとでメモリリークが起きます。
このときにシーンを保存すると「Cleaning up leaked objects in scene since no game object, component or manager is referencing them」のようなエラーメッセージが出て、マテリアルでテクスチャを参照する場合などに挙動不審になります。

string fileName = "Assets/output_images/xxx.png";
Texture2D tex = new Texture2D(256, 256, TextureFormat.RGB24, false);

byte [] pngData = tex.EncodeToPNG();
File.WriteAllBytes(fileName, pngData);

上記のような実行の場合、「Assets/output_images」内に画像をpngとして出力しています。
この場合にメモリリーク。

これの回避策としては、いったん「Object.DestroyImmediate」でTextureを解放し、
Assetから再度読み込みます。

Object.DestroyImmediate(tex);
tex = AssetDatabase.LoadAssetAtPath(fileName, typeof(Texture2D)) as Texture2D;


最終更新時間:2013年12月09日 23時49分50秒