Bitmap(BMP) fileのヘッダを取り除く

Bitmap(BMP) fileのヘッダを取り除くスクリプトを書きました。テキストで標準出力に出力しますが、バイナリで出すのも難しくはないでしょう。

https://gist.github.com/Shinichi-Ohki/5376430 に貼っておいたんですが、こちらにもソースを貼っておきます。

#!/usr/bin/env ruby

bmpFile = open(ARGV[0])
# Windowsの場合はバイナリファイルを扱う場合binmodeにしないと途中からデータがズレる
bmpFile.binmode
temp = bmpFile.read(2)		# Check file type
if temp!="BM"  then
	puts("Not BMP file")
	exit
end

bmpSize = bmpFile.read(4).unpack("V")		# Read file size
temp = bmpFile.read(4)		# Drop reserved area
bmpOffset = bmpFile.read(4).unpack("V")		# Read offset(from file head to picture data)
bmpHeaderSize = bmpFile.read(4).unpack("V")		# Read header size

if bmpHeaderSize == 12 then
	bmpWidth = bmpFile.read(2).unpack("v")
	bmpHeight = bmpFile.read(2).unpack("v")
	bmpPlanes = bmpFile.read(2).unpack("v")
	bmpBitCount = bmpFile.read(2).unpack("v")
	temp = bmpFile.read(bmpOffset[0]-26)
else
	bmpWidth = bmpFile.read(4).unpack("V")
	bmpHeight = bmpFile.read(4).unpack("V")
	bmpPlanes = bmpFile.read(2).unpack("v")
	bmpBitCount = bmpFile.read(2).unpack("v")
	temp = bmpFile.read(bmpOffset[0]-30)
end
bmpData = bmpFile.read(bmpWidth[0] * bmpHeight[0] * bmpBitCount[0] / 8)
=begin
print("Size = %d byte(s)\n"%bmpSize)		// For debug
print("Width = %d line(s)\n"%bmpWidth)
print("Height = %d line(s)\n"%bmpHeight)
print("Offset = %d byte(s)\n"%bmpOffset)
print("Data size = %d byte(s)\n"%bmpData.size)
=end

lc = bmpHeight[0]-1
lc.downto(0) do |j|
	(bmpWidth[0] * bmpBitCount[0] / 8).times do |i|
		print("0x%s"%bmpData[(j * (bmpWidth[0] * bmpBitCount[0] / 8)) + i].unpack("H*"))
		print(",") unless ((j==0) && (i==(bmpWidth[0] * bmpBitCount[0] / 8)-1))
		print("\n") if((i % 16)==15)
	end
end
GIF BOOK -コンテンツ制作者のためのGIFガイド
ビー・エヌ・エヌ新社
売り上げランキング: 205,429
カテゴリー: ソースコード, Ruby パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中