bmp.go 925 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package imagemeta
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "io"
  6. )
  7. var bmpMagick = []byte("BM")
  8. type BmpFormatError string
  9. func (e BmpFormatError) Error() string { return "invalid BMP format: " + string(e) }
  10. func DecodeBmpMeta(r io.Reader) (Meta, error) {
  11. var tmp [26]byte
  12. if _, err := io.ReadFull(r, tmp[:]); err != nil {
  13. return nil, err
  14. }
  15. if !bytes.Equal(tmp[:2], bmpMagick) {
  16. return nil, BmpFormatError("malformed header")
  17. }
  18. infoSize := binary.LittleEndian.Uint32(tmp[14:18])
  19. var width, height int
  20. if infoSize >= 40 {
  21. width = int(binary.LittleEndian.Uint32(tmp[18:22]))
  22. height = int(binary.LittleEndian.Uint32(tmp[22:26]))
  23. } else {
  24. // CORE
  25. width = int(binary.LittleEndian.Uint16(tmp[18:20]))
  26. height = int(binary.LittleEndian.Uint16(tmp[20:22]))
  27. }
  28. return &meta{
  29. format: "bmp",
  30. width: width,
  31. height: height,
  32. }, nil
  33. }
  34. func init() {
  35. RegisterFormat(string(bmpMagick), DecodeBmpMeta)
  36. }