BMP文件头定义:
WORD 两个字节 16bit
DWORD 四个字节 32bit
package main
import (
"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 main
import (
"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}
来源:oschina
链接:https://my.oschina.net/u/4289545/blog/3492001