png.go 688 B

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