1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2025-01-08 10:45:04 +02:00
imgproxy/imagemeta/bmp.go
2021-09-30 20:23:30 +06:00

56 lines
1.1 KiB
Go

package imagemeta
import (
"bytes"
"encoding/binary"
"io"
"github.com/imgproxy/imgproxy/v3/imagetype"
)
var bmpMagick = []byte("BM")
type BmpFormatError string
func (e BmpFormatError) Error() string { return "invalid BMP format: " + string(e) }
func DecodeBmpMeta(r io.Reader) (Meta, error) {
var tmp [26]byte
if _, err := io.ReadFull(r, tmp[:]); err != nil {
return nil, err
}
if !bytes.Equal(tmp[:2], bmpMagick) {
return nil, BmpFormatError("malformed header")
}
infoSize := binary.LittleEndian.Uint32(tmp[14:18])
var width, height int
if infoSize >= 40 {
width = int(binary.LittleEndian.Uint32(tmp[18:22]))
height = int(int32(binary.LittleEndian.Uint32(tmp[22:26])))
} else {
// CORE
width = int(binary.LittleEndian.Uint16(tmp[18:20]))
height = int(int16(binary.LittleEndian.Uint16(tmp[20:22])))
}
// height can be negative in Windows bitmaps
if height < 0 {
height = -height
}
return &meta{
format: imagetype.BMP,
width: width,
height: height,
}, nil
}
func init() {
RegisterFormat(string(bmpMagick), DecodeBmpMeta)
}