@@ -50,6 +50,7 @@ import qualified Data.Text.Encoding as TE
5050import Control.Applicative
5151import qualified Data.Attoparsec.ByteString.Char8 as A
5252import qualified Codec.Picture.Metadata as Metadata
53+import qualified Codec.Picture.Metadata.Exif as Exif
5354import Codec.Picture (decodeImageWithMetadata)
5455
5556-- quick and dirty functions to get image sizes
@@ -300,8 +301,16 @@ getSize img =
300301 Left e -> Left (T.pack e)
301302 Right (_, meta) -> do
302303 pxx <- maybe (Left "Could not determine width") Right $
304+ -- first look for exif image width, then width
305+ (Metadata.lookup
306+ (Metadata.Exif (Exif.TagUnknown 0xA002)) meta >>=
307+ exifDataToWord) <|>
303308 Metadata.lookup Metadata.Width meta
304309 pxy <- maybe (Left "Could not determine height") Right $
310+ -- first look for exif image height, then height
311+ (Metadata.lookup
312+ (Metadata.Exif (Exif.TagUnknown 0xA003)) meta >>=
313+ exifDataToWord) <|>
305314 Metadata.lookup Metadata.Height meta
306315 dpix <- maybe (Right 72) Right $ Metadata.lookup Metadata.DpiX meta
307316 dpiy <- maybe (Right 72) Right $ Metadata.lookup Metadata.DpiY meta
@@ -310,6 +319,10 @@ getSize img =
310319 , pxY = fromIntegral pxy
311320 , dpiX = fromIntegral dpix
312321 , dpiY = fromIntegral dpiy }
322+ where
323+ exifDataToWord (Exif.ExifLong x) = Just $ fromIntegral x
324+ exifDataToWord (Exif.ExifShort x) = Just $ fromIntegral x
325+ exifDataToWord _ = Nothing
313326
314327
315328svgSize :: WriterOptions -> ByteString -> Maybe ImageSize