diff --git a/internal/pkg/epubzip/image.go b/internal/pkg/epubzip/image.go index df87c4f..9d41de8 100644 --- a/internal/pkg/epubzip/image.go +++ b/internal/pkg/epubzip/image.go @@ -17,6 +17,18 @@ type Image struct { Data []byte } +var naiveJFIFHeader = []byte{ + 0xFF, 0xD8, // SOI + 0xFF, 0xE0, // APP0 Marker + 0x00, 0x10, // Length + 0x4A, 0x46, 0x49, 0x46, 0x00, // JFIF\0 + 0x01, 0x02, // 1.02 + 0x00, // Density type + 0x00, 0x01, // X Density + 0x00, 0x01, // Y Density + 0x00, 0x00, // No Thumbnail +} + // CompressImage create gzip encoded jpeg func CompressImage(filename string, format string, img image.Image, quality int) (Image, error) { var ( @@ -28,7 +40,11 @@ func CompressImage(filename string, format string, img image.Image, quality int) case "png": err = png.Encode(&data, img) case "jpeg": - err = jpeg.Encode(&data, img, &jpeg.Options{Quality: quality}) + // static JFIF header for better compatibility with Kindle devices + var b bytes.Buffer + err = jpeg.Encode(&b, img, &jpeg.Options{Quality: quality}) + data.Write(naiveJFIFHeader) + data.Write(b.Bytes()[2:]) default: err = fmt.Errorf("unknown format %q", format) }