強火で進め

このブログではプログラム関連の記事を中心に書いてます。

UnityからエクスポートしたHeightmapファイルの変換

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()