• go 读取BMP文件头二进制读取


    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}

  • 相关阅读:
    每周进度及工作量统计——2016.10.06-2016.10.13
    SCRUM站立会议模拟
    java词频统计——web版支持
    每周进度及工作量统计——2016.9.22--2016.9.29
    简易四则运算生成程序——第一次改进后的单元测试
    java词频统计——改进后的单元测试
    第一次通读《构建之法》阅读笔记
    centOS6.5网络配置
    webpack安装
    CommonJS和AMD/CMD
  • 原文地址:https://www.cnblogs.com/saryli/p/11064837.html
Copyright © 2020-2023  润新知