| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- package imagesize
- import (
- "encoding/binary"
- "io"
- )
- func icoBestSize(r io.Reader) (width, height byte, offset uint32, size uint32, err error) {
- var tmp [16]byte
- if _, err = io.ReadFull(r, tmp[:6]); err != nil {
- return
- }
- count := binary.LittleEndian.Uint16(tmp[4:6])
- for i := uint16(0); i < count; i++ {
- if _, err = io.ReadFull(r, tmp[:]); err != nil {
- return
- }
- if tmp[0] > width || tmp[1] > height || tmp[0] == 0 || tmp[1] == 0 {
- width = tmp[0]
- height = tmp[1]
- size = binary.LittleEndian.Uint32(tmp[8:12])
- offset = binary.LittleEndian.Uint32(tmp[12:16])
- }
- }
- return
- }
- func BestIcoPage(r io.Reader) (int, int, error) {
- _, _, offset, size, err := icoBestSize(r)
- return int(offset), int(size), err
- }
- func DecodeIcoMeta(r io.Reader) (*Meta, error) {
- bwidth, bheight, _, _, err := icoBestSize(r)
- if err != nil {
- return nil, err
- }
- width := int(bwidth)
- height := int(bheight)
- if width == 0 {
- width = 256
- }
- if height == 0 {
- height = 256
- }
- return &Meta{
- Format: "ico",
- Width: width,
- Height: height,
- }, nil
- }
- func init() {
- RegisterFormat("\x00\x00\x01\x00", DecodeIcoMeta)
- }
|