@@ -50,6 +50,7 @@ import qualified Data.Text.Encoding as TE
50import Control.Applicative
50import Control.Applicative
51import qualified Data.Attoparsec.ByteString.Char8 as A
51import qualified Data.Attoparsec.ByteString.Char8 as A
52import qualified Codec.Picture.Metadata as Metadata
52import qualified Codec.Picture.Metadata as Metadata
53+import qualified Codec.Picture.Metadata.Exif as Exif
53import Codec.Picture (decodeImageWithMetadata)
54import Codec.Picture (decodeImageWithMetadata)
55-- quick and dirty functions to get image sizes
56-- quick and dirty functions to get image sizes
@@ -300,8 +301,16 @@ getSize img =
300 Left e -> Left (T.pack e)
301 Left e -> Left (T.pack e)
301 Right (_, meta) -> do
302 Right (_, meta) -> do
302 pxx <- maybe (Left "Could not determine width") Right $
303 pxx <- maybe (Left "Could not determine width") Right $
304+ -- first look for exif image width, then width
306+ (Metadata.Exif (Exif.TagUnknown 0xA002)) meta >>=
303 Metadata.lookup Metadata.Width meta
308 Metadata.lookup Metadata.Width meta
304 pxy <- maybe (Left "Could not determine height") Right $
309 pxy <- maybe (Left "Could not determine height") Right $
310+ -- first look for exif image height, then height
312+ (Metadata.Exif (Exif.TagUnknown 0xA003)) meta >>=
305 Metadata.lookup Metadata.Height meta
314 Metadata.lookup Metadata.Height meta
306 dpix <- maybe (Right 72) Right $ Metadata.lookup Metadata.DpiX meta
315 dpix <- maybe (Right 72) Right $ Metadata.lookup Metadata.DpiX meta
307 dpiy <- maybe (Right 72) Right $ Metadata.lookup Metadata.DpiY meta
316 dpiy <- maybe (Right 72) Right $ Metadata.lookup Metadata.DpiY meta
@@ -310,6 +319,10 @@ getSize img =
310 , pxY = fromIntegral pxy
319 , pxY = fromIntegral pxy
311 , dpiX = fromIntegral dpix
320 , dpiX = fromIntegral dpix
312 , dpiY = fromIntegral dpiy }
321 , dpiY = fromIntegral dpiy }
323+ exifDataToWord (Exif.ExifLong x) = Just $ fromIntegral x
324+ exifDataToWord (Exif.ExifShort x) = Just $ fromIntegral x
325+ exifDataToWord _ = Nothing
315svgSize :: WriterOptions -> ByteString -> Maybe ImageSize
328svgSize :: WriterOptions -> ByteString -> Maybe ImageSize