diff options
author | Stefan Pöschel <github@basicmaster.de> | 2015-11-29 20:38:49 +0100 |
---|---|---|
committer | Stefan Pöschel <github@basicmaster.de> | 2015-11-29 20:38:49 +0100 |
commit | 3c6bffdede22fcebb62bac5abf11feb9ea7333e1 (patch) | |
tree | de07d54cb2be33a91c8b9541357f0a8eaad7e692 | |
parent | 5fcfec4c1a51be35ebeeca88cc0633ff996ef71d (diff) | |
download | fdk-aac-3c6bffdede22fcebb62bac5abf11feb9ea7333e1.tar.gz fdk-aac-3c6bffdede22fcebb62bac5abf11feb9ea7333e1.tar.bz2 fdk-aac-3c6bffdede22fcebb62bac5abf11feb9ea7333e1.zip |
MOT encoder: fix possible odd target image size
The method MagickBorderImage adds the same amount of border on left/right resp.
top/bottom side. Thus if the source image has an odd size (e.g. 201x200 px),
the resulting size gets odd, too (here 319x240 px).
To prevent this, the border is added by inserting the resized image centered
into a black background of 320x240 px.
-rw-r--r-- | src/mot-encoder.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/mot-encoder.cpp b/src/mot-encoder.cpp index 9abbd0e..e1c965f 100644 --- a/src/mot-encoder.cpp +++ b/src/mot-encoder.cpp @@ -905,6 +905,7 @@ size_t resizeImage(MagickWand* m_wand, unsigned char** blob) size_t height = MagickGetImageHeight(m_wand); size_t width = MagickGetImageWidth(m_wand); + MagickWand *bg_wand = NULL; PixelWand *p_wand = NULL; while (height > 240 || width > 320) { @@ -924,23 +925,28 @@ size_t resizeImage(MagickWand* m_wand, unsigned char** blob) // Make sure smaller images are 320x240 pixels, and // add a black border + bg_wand = NewMagickWand(); + p_wand = NewPixelWand(); PixelSetColor(p_wand, "black"); - MagickBorderImage(m_wand, p_wand, (320-width)/2, (240-height)/2); + MagickNewImage(bg_wand, 320, 240, p_wand); DestroyPixelWand(p_wand); - height = MagickGetImageHeight(m_wand); - width = MagickGetImageWidth(m_wand); + MagickCompositeImage(bg_wand, m_wand, OverCompositeOp, (320-width)/2, (240-height)/2); - MagickSetImageFormat(m_wand, "jpg"); + + height = MagickGetImageHeight(bg_wand); + width = MagickGetImageWidth(bg_wand); + + MagickSetImageFormat(bg_wand, "jpg"); int quality = 100; do { quality -= 5; - MagickSetImageCompressionQuality(m_wand, quality); - *blob = MagickGetImagesBlob(m_wand, &blobsize); + MagickSetImageCompressionQuality(bg_wand, quality); + *blob = MagickGetImagesBlob(bg_wand, &blobsize); } while (blobsize > MAXSLIDESIZE && quality > MINQUALITY); if (blobsize > MAXSLIDESIZE) { @@ -954,6 +960,8 @@ size_t resizeImage(MagickWand* m_wand, unsigned char** blob) fprintf(stderr, "mot-encoder resized image to %zu x %zu. Size after compression %zu bytes (q=%d)\n", width, height, blobsize, quality); } + + DestroyMagickWand(bg_wand); return blobsize; } #endif |