ico.go 1008 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package imageSize
  2. import (
  3. "encoding/binary"
  4. "io"
  5. )
  6. func icoBestSize(r io.Reader) (width, height byte, page uint16, err error) {
  7. var tmp [16]byte
  8. if _, err = io.ReadFull(r, tmp[:6]); err != nil {
  9. return
  10. }
  11. count := binary.LittleEndian.Uint16(tmp[4:6])
  12. for i := uint16(0); i < count; i++ {
  13. if _, err = io.ReadFull(r, tmp[:]); err != nil {
  14. return
  15. }
  16. if tmp[0] > width || tmp[1] > height || tmp[0] == 0 || tmp[1] == 0 {
  17. width = tmp[0]
  18. height = tmp[1]
  19. page = i
  20. }
  21. }
  22. return
  23. }
  24. func BestIcoPage(r io.Reader) (int, error) {
  25. _, _, page, err := icoBestSize(r)
  26. return int(page), err
  27. }
  28. func DecodeIcoMeta(r io.Reader) (*Meta, error) {
  29. bwidth, bheight, _, err := icoBestSize(r)
  30. if err != nil {
  31. return nil, err
  32. }
  33. width := int(bwidth)
  34. height := int(bheight)
  35. if width == 0 {
  36. width = 256
  37. }
  38. if height == 0 {
  39. height = 256
  40. }
  41. return &Meta{
  42. Format: "ico",
  43. Width: width,
  44. Height: height,
  45. }, nil
  46. }
  47. func init() {
  48. RegisterFormat("\x00\x00\x01\x00", DecodeIcoMeta)
  49. }