From 1d1caeb06ab651635aaefa1140a495d2c1ac39c9 Mon Sep 17 00:00:00 2001 From: DarthSim Date: Fri, 14 Feb 2020 19:32:05 +0600 Subject: [PATCH] Fix loadind BMP stored in ICO --- CHANGELOG.md | 2 ++ imagemeta/ico.go | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ process.go | 14 ++++++++++++-- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04f2c3b9..e2ba6aad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [Unreleased] +### Fixed +- Fix loadind BMP stored in ICO. ## [2.10.0] - 2020-02-13 ### Added diff --git a/imagemeta/ico.go b/imagemeta/ico.go index 686ac4ca..c00d8f3a 100644 --- a/imagemeta/ico.go +++ b/imagemeta/ico.go @@ -1,6 +1,7 @@ package imagemeta import ( + "bytes" "encoding/binary" "io" ) @@ -83,3 +84,51 @@ func init() { func(r io.Reader) (Meta, error) { return DecodeIcoMeta(r) }, ) } + +// FixBmpHeader fixes an incomplete header of BMP stored in ICO +func FixBmpHeader(b []byte) ([]byte, error) { + buf := new(bytes.Buffer) + + fileSize := uint32(14 + len(b)) + + buf.Grow(int(fileSize)) + + buf.Write(bmpMagick) + + if err := binary.Write(buf, binary.LittleEndian, &fileSize); err != nil { + return nil, err + } + + reserved := uint32(0) + if err := binary.Write(buf, binary.LittleEndian, &reserved); err != nil { + return nil, err + } + + colorUsed := binary.LittleEndian.Uint32(b[32:36]) + bitCount := binary.LittleEndian.Uint16(b[14:16]) + + var pixOffset uint32 + if colorUsed == 0 && bitCount <= 8 { + pixOffset = 14 + 40 + 4*(1<