diff --git a/LICENSE.txt b/LICENSE.txt index 7620637..021ad2a 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2012 - 2016 Mikael Roos, me@mikaelroos.se +Copyright (c) 2012 - 2016 Mikael Roos, https://mikaelroos.se, mos@dbwebb.se Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/CImage/CImage.php b/src/CImage/CImage.php index bb30868..887c498 100644 --- a/src/CImage/CImage.php +++ b/src/CImage/CImage.php @@ -2542,10 +2542,8 @@ class CImage $this->log("Output format is: $format"); if (!$this->verbose && $format == 'json') { - #header('Content-type: application/json'); - #echo $this->json($file); - return serialize(["hello", 1]); - #return; + header('Content-type: application/json'); + echo $this->json($file); exit; } elseif ($format == 'ascii') { header('Content-type: text/plain'); diff --git a/src/CImage/CImageResizer.php b/src/CImage/CImageResizer.php index fd7c9fa..18bb570 100644 --- a/src/CImage/CImageResizer.php +++ b/src/CImage/CImageResizer.php @@ -253,14 +253,17 @@ class CImageResizer * @param float &$current value to check and change. * @param float $orig value to check against. * - * @return float as the value respected by the upscale setting. + * @return boolean true if upscaled changed values, else false. */ public function respectUpscale(&$current, $orig) { if (!$this->upscale && $current > $orig) { - $this->log("# Disallowed upscale of $orig to $current"); + $this->log("# Disallowed upscale to $current ($orig)"); $current = $orig; + return true; } + + return false; } @@ -553,24 +556,54 @@ class CImageResizer } elseif ($rs === CImageResizer::STRETCH && $both) { // Stretch to fit, leave as is - // Ignores respectUpscale by intention - $this->log(" Stretch, leave as is"); + $this->log(" Stretch"); + + // respectUpscale + $dw = $tw; + $dh = $th; + $this->respectUpscale($dw, $sw); + $this->respectUpscale($dh, $sh); + $dx = ($tw - $dw) / 2; + $dy = ($th - $dh) / 2; + + $this->log(" Destination area dx=$dx, dy=$dy, dw=$dw, dh=$dh"); } elseif ($rs === CImageResizer::CROP_TO_FIT && $both) { // Crop to fit image in box - // Ignores respectUpscale by intention $this->log(" Crop to fit, ratio target=$ratio, source=$ar"); + // Respect upscale + $dw = $tw; + $dh = $th; + $this->respectUpscale($dw, $sw); + $this->respectUpscale($dh, $sh); + $dx = ($tw - $dw) / 2; + $dy = ($th - $dh) / 2; + + // Manage landscape/portrait if ($ratio > $ar) { $ch = $sw / $ratio; $cy = ($sh - $ch) / 2; + $this->log(" Crop by cy=$cy ch=$ch"); } elseif ($ratio < $ar) { $cw = $sh * $ratio; $cx = ($sw - $cw) / 2; + $this->log(" Crop by cx=$cx cw=$cw"); + } + + // Update crop when no upscale + if (!$this->upscale && $dx) { + $cy = $th < $sh ? ($sh - $th) / 2 : 0; + $ch = $dh; + } + if (!$this->upscale && $dy) { + $cx = $tw < $sw ? ($sw - $tw) / 2 : 0; + $cw = $dw; } $this->log(" Parts cx=$cx, cy=$cy, cw=$cw, ch=$ch"); + $this->log(" Destination area dx=$dx, dy=$dy, dw=$dw, dh=$dh"); } elseif ($rs === CImageResizer::FILL_TO_FIT && $both) { @@ -579,6 +612,7 @@ class CImageResizer $dw = $tw; $dh = $th; + // Manage landscape/portrait if ($ratio > $ar) { $dw = $th * $ar; $dh = $th; @@ -586,14 +620,13 @@ class CImageResizer $dw = $tw; $dh = $tw / $ar; } - + $this->respectUpscale($dw, $sw); $this->respectUpscale($dh, $sh); $dx = ($tw - $dw) / 2; $dy = ($th - $dh) / 2; $this->log(" Destination area dx=$dx, dy=$dy, dw=$dw, dh=$dh"); - } // All done, sum it up diff --git a/test/Tests.txt b/test/Tests.txt index fc14fef..272ca64 100644 --- a/test/Tests.txt +++ b/test/Tests.txt @@ -5,3 +5,9 @@ Use resize fill-to-fit, crop-to-fit, stretch without width and height should res ## Integration tests Checkout a version using composer and execute all tests, prefarably on cimage.se. + + + +## Reference images + +Create a bunch of reference images to compare between versions. Save together with how it was created. diff --git a/webroot/img/tower.jpg b/webroot/img/tower.jpg new file mode 100644 index 0000000..b70f7c1 Binary files /dev/null and b/webroot/img/tower.jpg differ diff --git a/webroot/test/option-no-upscale.php b/webroot/test/option-no-upscale.php index 897ad73..37b33d9 100644 --- a/webroot/test/option-no-upscale.php +++ b/webroot/test/option-no-upscale.php @@ -18,43 +18,38 @@ $description = "Do not upscale image when original image (slice) is smaller than $images = array( 'car.png', 'apple.jpg', + 'tower.jpg', ); // For each image, apply these testcases -$nc = "&bgc=660000"; //null; //"&nc"; //null; //&nc'; +$nc = "&bgc=660000&nc"; //null; //"&nc"; //null; //&nc'; $testcase = array( $nc . '&w=600', $nc . '&w=600&no-upscale', - $nc . '&h=400', - $nc . '&h=400&no-upscale', - $nc . '&w=600&h=400', - $nc . '&w=600&h=400&no-upscale', - $nc . '&w=700&h=400&stretch', - $nc . '&w=700&h=400&no-upscale&stretch', + $nc . '&h=420', + $nc . '&h=420&no-upscale', + $nc . '&w=600&h=420', + $nc . '&w=600&h=420&no-upscale', + $nc . '&w=700&h=420&stretch', + $nc . '&w=700&h=420&no-upscale&stretch', $nc . '&w=700&h=200&stretch', $nc . '&w=700&h=200&no-upscale&stretch', - $nc . '&w=250&h=400&stretch', - $nc . '&w=250&h=400&no-upscale&stretch', - $nc . '&w=700&h=400&crop-to-fit', - $nc . '&w=700&h=400&no-upscale&crop-to-fit', + $nc . '&w=250&h=420&stretch', + $nc . '&w=250&h=420&no-upscale&stretch', + $nc . '&w=700&h=420&crop-to-fit', + $nc . '&w=700&h=420&no-upscale&crop-to-fit', $nc . '&w=700&h=200&crop-to-fit', $nc . '&w=700&h=200&no-upscale&crop-to-fit', - $nc . '&w=250&h=400&crop-to-fit', - $nc . '&w=250&h=400&no-upscale&crop-to-fit', + $nc . '&w=250&h=420&crop-to-fit', + $nc . '&w=250&h=420&no-upscale&crop-to-fit', $nc . '&w=600&h=500&fill-to-fit', $nc . '&w=600&h=500&no-upscale&fill-to-fit', - $nc . '&w=250&h=400&fill-to-fit', - $nc . '&w=250&h=400&no-upscale&fill-to-fit', - $nc . '&w=700&h=400&fill-to-fit', - $nc . '&w=700&h=400&no-upscale&fill-to-fit', -/* - $nc . '&w=600&ar=1.6', - $nc . '&w=600&ar=1.6&no-upscale', - $nc . '&h=400&ar=1.6', - $nc . '&h=400&ar=1.6&no-upscale', -*/ + $nc . '&w=250&h=420&fill-to-fit', + $nc . '&w=250&h=420&no-upscale&fill-to-fit', + $nc . '&w=700&h=420&fill-to-fit', + $nc . '&w=700&h=420&no-upscale&fill-to-fit', );