UnityからエクスポートしたHeightmapファイルは何故かRAWファイルで有る為、あまり開けるアプリが有りません(Photoshopだと開けるみたいです)。
その為、「RAWファイルをPNGファイルに変換」とその逆を行うPythonのプログラムを書きました。
RAWデータは素直に高さ(Height)がグレースケールで0〜256(Bit16で出力した場合は8倍の範囲)で出力されるみたいなのでそのままPNGのグレースケールにするだけで済みました。
※このプログラムは元が16bitの精度を持つデータを8bitのデータに変換させている為、データが劣化する場合が有ります。データの精度が必要な場合は事前に充分にテストしてから使用するかどうか判断して下さい。
※このプログラムではPILモジュールを使用します。実行環境にインストール後にプログラムを実行して下さい。
RAWファイル→PNGファイル
こちちらはUnityで「Bit8、Mac」の設定でエクススポートしたファイル向け。
コマンドラインでの実行時の引数は以下となります。
python .pyファイル RAWファイル PNGファイル
#! /usr/bin/env python # coding: utf-8 # coding=utf-8 # -*- coding: utf-8 -*- # vim: fileencoding=utf-8 import sys, os import math import struct from PIL import Image if (len(sys.argv) != 2): print 'Usage: # python %s row_file out_file' % sys.argv[0] quit() raw = open(sys.argv[1], 'r') (infile_base, infile_ext) = os.path.splitext(sys.argv[1]) outfile = infile_base+'.png' data = bytearray() data.extend(raw.read()) w = int( math.sqrt(len(data)) ) h = w print "w: %d h:%d" % (w, h) img = Image.new("L", (w, h)) img.putdata(list(data)) img.save(outfile)
こちちらはUnityで「Bit16、Mac」の設定でエクススポートしたファイル向け。
#! /usr/bin/env python # coding: utf-8 # coding=utf-8 # -*- coding: utf-8 -*- # vim: fileencoding=utf-8 import sys, os import math import struct from PIL import Image if (len(sys.argv) != 2): print 'Usage: # python %s row_file out_file' % sys.argv[0] quit() raw = open(sys.argv[1], 'r') raw_size = os.path.getsize(sys.argv[1]) (infile_base, infile_ext) = os.path.splitext(sys.argv[1]) outfile = infile_base+'.png' print "size : ", raw_size print "size : ", math.sqrt(raw_size/2) w = int( math.sqrt(raw_size/2) ) h = w print "w: %d h:%d" % (w, h) #raw = open(sys.argv[1], 'r') raw.seek(0) data = bytearray() for y in range(h): for x in range(w): d = struct.unpack("<H", raw.read(2)) data.extend([int(d[0]/256.0)]) img = Image.new("L", (w, h)) img.putdata(data) img.save(outfile)
PNGファイル→RAWファイル
8ビットのRAWに変換します。「Bit 8」の設定でUnityにインポートして下さい。
コマンドラインでの実行時の引数は以下となります。
python .pyファイル PNGファイル RAWファイル
#! /usr/bin/env python # coding: utf-8 # coding=utf-8 # -*- coding: utf-8 -*- # vim: fileencoding=utf-8 import sys import math import struct from PIL import Image if (len(sys.argv) != 3): print 'Usage: # python %s png_file raw_file' % sys.argv[0] quit() img = Image.open(sys.argv[1]) w, h = img.size print "w: %d h:%d" % (w, h) out = open(sys.argv[2], 'wb') out.write(bytearray(img.getdata())) out.close()