BMP文件头定义:
WORD 两个字节 16bit
DWORD 四个字节 32bit
package mainimport (
"encoding/binary"
"fmt"
"os"
)func main() {
file, err := os.Open("tim.bmp")
if err != nil {
fmt.Println(err)
return
}defer file.Close()//type拆成两个byte来读
var headA, headB byte
//Read第二个参数字节序一般windows/linux大部分都是LittleEndian,苹果系统用BigEndian
binary.Read(file, binary.LittleEndian, &headA)
binary.Read(file, binary.LittleEndian, &headB)//文件大小
var size uint32
binary.Read(file, binary.LittleEndian, &size)//预留字节
var reservedA, reservedB uint16
binary.Read(file, binary.LittleEndian, &reservedA)
binary.Read(file, binary.LittleEndian, &reservedB)//偏移字节
var offbits uint32
binary.Read(file, binary.LittleEndian, &offbits)fmt.Println(headA, headB, size, reservedA, reservedB, offbits)}
执行结果
66 77 196662 0 0 54
使用结构体方式
package mainimport (
"encoding/binary"
"fmt"
"os"
)type BitmapInfoHeader struct {
Size uint32
Width int32
Height int32
Places uint16
BitCount uint16
Compression uint32
SizeImage uint32
XperlsPerMeter int32
YperlsPerMeter int32
ClsrUsed uint32
ClrImportant uint32
}func main() {
file, err := os.Open("tim.bmp")
if err != nil {
fmt.Println(err)
return
}defer file.Close()//type拆成两个byte来读
var headA, headB byte
//Read第二个参数字节序一般windows/linux大部分都是LittleEndian,苹果系统用BigEndian
binary.Read(file, binary.LittleEndian, &headA)
binary.Read(file, binary.LittleEndian, &headB)//文件大小
var size uint32
binary.Read(file, binary.LittleEndian, &size)//预留字节
var reservedA, reservedB uint16
binary.Read(file, binary.LittleEndian, &reservedA)
binary.Read(file, binary.LittleEndian, &reservedB)//偏移字节
var offbits uint32
binary.Read(file, binary.LittleEndian, &offbits)fmt.Println(headA, headB, size, reservedA, reservedB, offbits)infoHeader := new(BitmapInfoHeader)
binary.Read(file, binary.LittleEndian, infoHeader)
fmt.Println(infoHeader)}
执行结果:
66 77 196662 0 0 54
&{40 256 256 1 24 0 196608 3100 3100 0 0}