トップ 一覧 検索 ヘルプ RSS ログイン

unity_script_texture2d_save_png_fileの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Texture2Dをpngとしてファイル保存

「[[Texture2Dをpngに変換|unity_script_texture2d_convert_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;

----
{{lastmodified}}