png.go 741 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package imagemeta
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "io"
  6. )
  7. var pngMagick = []byte("\x89PNG\r\n\x1a\n")
  8. type PngFormatError string
  9. func (e PngFormatError) Error() string { return "invalid PNG format: " + string(e) }
  10. func DecodePngMeta(r io.Reader) (Meta, error) {
  11. var tmp [16]byte
  12. if _, err := io.ReadFull(r, tmp[:8]); err != nil {
  13. return nil, err
  14. }
  15. if !bytes.Equal(pngMagick, tmp[:8]) {
  16. return nil, PngFormatError("not a PNG image")
  17. }
  18. if _, err := io.ReadFull(r, tmp[:]); err != nil {
  19. return nil, err
  20. }
  21. return &meta{
  22. format: "png",
  23. width: int(binary.BigEndian.Uint32(tmp[8:12])),
  24. height: int(binary.BigEndian.Uint32(tmp[12:16])),
  25. }, nil
  26. }
  27. func init() {
  28. RegisterFormat(string(pngMagick), DecodePngMeta)
  29. }