#!/usr/bin/perl #これたぶんRA(レゾナンスエイジ)のNSDファイルをbmpにするスクリプトで #とりあえず動けばいいやなのですげー重かった気がする。 #しかもこれ書いたときvecとかしらんかった。。 use strict; my $buf; my $filename = shift; my ( $red, $green, $bule, $alfa, $data, $header ); $filename =~ /^(.*)\.NSD$/; my $output = "$1.bmp"; open( FILE, "<$filename" ) or die; binmode FILE; open( OUT, ">$output" ) or die; binmode OUT; foreach( 1 .. 14 ) { read( FILE, $buf, 2 ); } read( FILE, $buf, 2 ); my $width = unpack("S", $buf); read( FILE, $buf, 2 ); my $height = unpack("S", $buf); print OUT &make_bmp_header( $width, $height ); for ( 1 .. $height ) { for ( 1 .. $width ) { read( FILE, $buf, 2 ); $buf = 0x0000 unless $buf; $buf = pack( "B16", unpack( "B16", $buf ) ); my @bit; for( 0 .. 15 ){ $bit[$_] = vec( $buf, $_, 1 )? "1" : "0"; } $_ = "$bit[4]$bit[3]$bit[2]$bit[1]$bit[0]000$bit[10]$bit[9]$bit[8]$bit[7]$bit[6]$bit[5]00$bit[15]$bit[14]$bit[13]$bit[12]$bit[11]000"; print OUT pack( "B24", $_ ); } } close FILE; close OUT; sub make_bmp_header { my $width = shift; my $height = shift; my $bfType = 'BM'; #ビットマップデータであることを示すシグネチャ。 my $bfSize = &SeekDataSize( $width, $height ); #ビットマップの全データサイズ。 my $bfReserved1 = 0; #予約1。常に0。 my $bfReserved2 = 0; #予約2。常に0。 my $bfOffBits = 54; #データ先頭から数えたイメージデータの開始位置。 my $biSize = 40; #BITMAPFILEHEADER のデータサイズ。40Byte my $biWidth = $width; #イメージの幅。ピクセル値で指定 my $biHeight = $height; #イメージの幅。ピクセル値で指定 my $biPlanes = 1; #イメージのレイヤー数。通常は1をセット my $biBitCount = 24; #1ピクセルあたりのビット数。 my $biCompression = 0; #圧縮形式。0=なし,1=RLE8,2=RLE4,3=ビットフィールド my $biSizeImage = $bfSize - $bfOffBits; #イメージのデータサイズ。 my $biPelsPerMeter = 0; #1メートル当たりの水平解像度。 my $biPelsPerMeter = 0; #1メートル当たりの垂直解像度。 my $biClrUsed = 0; #実際に使用するカラーインデックス数。 my $biClrImportant = 0; #重要なパレット数。通常0 my $rgbRed = 0; #パレットデータ赤(0〜255) 未使用 my $rgbGreen = 0; #パレットデータ緑(0〜255) 未使用 my $rgbBlue = 0; #パレットデータ青(0〜255) 未使用 my $rgbReserved = 0; #パレットデータ予備(通常ゼロ) 未使用 my $header .= $bfType; $header .= pack("V", $bfSize); $header .= pack("S", $bfReserved1); $header .= pack("S", $bfReserved2); $header .= pack("V", $bfOffBits); $header .= pack("V", $biSize); $header .= pack("V", $biWidth); $header .= pack("V", $biHeight); $header .= pack("S", $biPlanes); $header .= pack("S", $biBitCount); $header .= pack("V", $biCompression); $header .= pack("V", $biSizeImage); $header .= pack("V", $biPelsPerMeter); $header .= pack("V", $biPelsPerMeter); $header .= pack("V", $biClrUsed); $header .= pack("V", $biClrImportant); return $header; } sub SeekDataSize { my($Width, $Height) = @_; my $mod = (($Width * 3) % 4); my $gomi; if ($mod != 0) { $gomi = 4 - $mod; } my $DataSize = oct("0x36") + ((($Width * 3) + $gomi) * $Height); return $DataSize; }