mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
NEW Allow the paddedresize to take another hex value to specify a transparency on the padded color
This commit is contained in:
parent
2ea07f9c84
commit
dae2295e16
@ -63,6 +63,19 @@ Image methods are chainable. Example:
|
|||||||
|
|
||||||
:::ss
|
:::ss
|
||||||
<body style="background-image:url($Image.ScaleWidth(800).CropHeight(800).Link)">
|
<body style="background-image:url($Image.ScaleWidth(800).CropHeight(800).Link)">
|
||||||
|
|
||||||
|
### Padded Image Resize
|
||||||
|
|
||||||
|
The Pad method allows you to resize an image with existing ratio and will
|
||||||
|
pad any surplus space. You can specify the color of the padding using a hex code such as FFFFFF or 000000.
|
||||||
|
|
||||||
|
You can also specify a level of transparency to apply to the padding color in a fourth param. This will only effect
|
||||||
|
png images.
|
||||||
|
|
||||||
|
:::php
|
||||||
|
$Image.Pad(80, 80, FFFFFF, 50) // white padding with 50% transparency
|
||||||
|
$Image.Pad(80, 80, FFFFFF, 100) // white padding with 100% transparency
|
||||||
|
$Image.Pad(80, 80, FFFFFF) // white padding with no transparency
|
||||||
|
|
||||||
### Manipulating images in PHP
|
### Manipulating images in PHP
|
||||||
|
|
||||||
|
@ -417,14 +417,20 @@ class GDBackend extends Object implements Image_Backend {
|
|||||||
return $useAsMinimum ? $this->resizeByWidth( $maxWidth ) : $this->resizeByHeight( $maxHeight );
|
return $useAsMinimum ? $this->resizeByWidth( $maxWidth ) : $this->resizeByHeight( $maxHeight );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function color_web2gd($image, $webColor) {
|
public static function color_web2gd($image, $webColor, $transparencyPercent = 0) {
|
||||||
if(substr($webColor,0,1) == "#") $webColor = substr($webColor,1);
|
if(substr($webColor,0,1) == "#") $webColor = substr($webColor,1);
|
||||||
$r = hexdec(substr($webColor,0,2));
|
$r = hexdec(substr($webColor,0,2));
|
||||||
$g = hexdec(substr($webColor,2,2));
|
$g = hexdec(substr($webColor,2,2));
|
||||||
$b = hexdec(substr($webColor,4,2));
|
$b = hexdec(substr($webColor,4,2));
|
||||||
|
|
||||||
|
if($transparencyPercent) {
|
||||||
|
if($transparencyPercent > 100) {
|
||||||
|
$transparencyPercent = 100;
|
||||||
|
}
|
||||||
|
$a = 127 * bcdiv($transparencyPercent, 100, 2);
|
||||||
|
return imagecolorallocatealpha($image, $r, $g, $b, $a);
|
||||||
|
}
|
||||||
return imagecolorallocate($image, $r, $g, $b);
|
return imagecolorallocate($image, $r, $g, $b);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -433,8 +439,11 @@ class GDBackend extends Object implements Image_Backend {
|
|||||||
* @param width
|
* @param width
|
||||||
* @param height
|
* @param height
|
||||||
* @param backgroundColour
|
* @param backgroundColour
|
||||||
|
* @param transparencyPercent
|
||||||
*/
|
*/
|
||||||
public function paddedResize($width, $height, $backgroundColor = "FFFFFF") {
|
public function paddedResize($width, $height, $backgroundColor = "FFFFFF", $transparencyPercent = 0) {
|
||||||
|
//keep the % within bounds of 0-100
|
||||||
|
$transparencyPercent = min(100, max(0, $transparencyPercent));
|
||||||
if(!$this->gd) return;
|
if(!$this->gd) return;
|
||||||
$width = round($width);
|
$width = round($width);
|
||||||
$height = round($height);
|
$height = round($height);
|
||||||
@ -450,7 +459,7 @@ class GDBackend extends Object implements Image_Backend {
|
|||||||
imagealphablending($newGD, false);
|
imagealphablending($newGD, false);
|
||||||
imagesavealpha($newGD, true);
|
imagesavealpha($newGD, true);
|
||||||
|
|
||||||
$bg = GD::color_web2gd($newGD, $backgroundColor);
|
$bg = GD::color_web2gd($newGD, $backgroundColor, $transparencyPercent);
|
||||||
imagefilledrectangle($newGD, 0, 0, $width, $height, $bg);
|
imagefilledrectangle($newGD, 0, 0, $width, $height, $bg);
|
||||||
|
|
||||||
$destAR = $width / $height;
|
$destAR = $width / $height;
|
||||||
|
@ -194,11 +194,19 @@ class ImagickBackend extends Imagick implements Image_Backend {
|
|||||||
*
|
*
|
||||||
* @param int $width
|
* @param int $width
|
||||||
* @param int $height
|
* @param int $height
|
||||||
|
* @param int $transparencyPercent
|
||||||
* @return Image_Backend
|
* @return Image_Backend
|
||||||
*/
|
*/
|
||||||
public function paddedResize($width, $height, $backgroundColor = "FFFFFF") {
|
public function paddedResize($width, $height, $backgroundColor = "FFFFFF", $transparencyPercent = 0) {
|
||||||
|
//keep the % within bounds of 0-100
|
||||||
|
$transparencyPercent = min(100, max(0, $transparencyPercent));
|
||||||
$new = $this->resizeRatio($width, $height);
|
$new = $this->resizeRatio($width, $height);
|
||||||
$new->setImageBackgroundColor("#".$backgroundColor);
|
if($transparencyPercent) {
|
||||||
|
$alphaHex = $this->calculateAlphaHex($transparencyPercent);
|
||||||
|
$new->setImageBackgroundColor("#{$backgroundColor}{$alphaHex}");
|
||||||
|
} else {
|
||||||
|
$new->setImageBackgroundColor("#{$backgroundColor}");
|
||||||
|
}
|
||||||
$w = $new->getImageWidth();
|
$w = $new->getImageWidth();
|
||||||
$h = $new->getImageHeight();
|
$h = $new->getImageHeight();
|
||||||
$new->extentImage($width,$height,($w-$width)/2,($h-$height)/2);
|
$new->extentImage($width,$height,($w-$width)/2,($h-$height)/2);
|
||||||
@ -206,6 +214,25 @@ class ImagickBackend extends Imagick implements Image_Backend {
|
|||||||
return $new;
|
return $new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a percentage (or 'true') to a two char hex code to signifiy the level of an alpha channel
|
||||||
|
*
|
||||||
|
* @param $percent
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function calculateAlphaHex($percent) {
|
||||||
|
if($percent > 100) {
|
||||||
|
$percent = 100;
|
||||||
|
}
|
||||||
|
// unlike GD, this uses 255 instead of 127, and is reversed. Lower = more transparent
|
||||||
|
$alphaHex = dechex(255 - floor(255 * bcdiv($percent, 100, 2)));
|
||||||
|
if(strlen($alphaHex) == 1) {
|
||||||
|
$alphaHex = '0' .$alphaHex;
|
||||||
|
}
|
||||||
|
return $alphaHex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* croppedResize
|
* croppedResize
|
||||||
*
|
*
|
||||||
|
@ -339,12 +339,13 @@ class Image extends File implements Flushable {
|
|||||||
*
|
*
|
||||||
* @param integer $width The width to size to
|
* @param integer $width The width to size to
|
||||||
* @param integer $height The height to size to
|
* @param integer $height The height to size to
|
||||||
|
* @param integer $transparencyPercent Level of transparency
|
||||||
* @return Image|null
|
* @return Image|null
|
||||||
*/
|
*/
|
||||||
public function Pad($width, $height, $backgroundColor='FFFFFF') {
|
public function Pad($width, $height, $backgroundColor='FFFFFF', $transparencyPercent = 0) {
|
||||||
return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample')
|
return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample')
|
||||||
? $this
|
? $this
|
||||||
: $this->getFormattedImage('Pad', $width, $height, $backgroundColor);
|
: $this->getFormattedImage('Pad', $width, $height, $backgroundColor, $transparencyPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -654,12 +655,13 @@ class Image extends File implements Flushable {
|
|||||||
*
|
*
|
||||||
* @param integer $width The width to size to
|
* @param integer $width The width to size to
|
||||||
* @param integer $height The height to size to
|
* @param integer $height The height to size to
|
||||||
|
* @param integer $transparencyPercent Level of transparency
|
||||||
* @return Image
|
* @return Image
|
||||||
* @deprecated 4.0 Use Pad instead
|
* @deprecated 4.0 Use Pad instead
|
||||||
*/
|
*/
|
||||||
public function PaddedImage($width, $height, $backgroundColor='FFFFFF') {
|
public function PaddedImage($width, $height, $backgroundColor='FFFFFF', $transparencyPercent = 0) {
|
||||||
Deprecation::notice('4.0', 'Use Pad instead');
|
Deprecation::notice('4.0', 'Use Pad instead');
|
||||||
return $this->Pad($width, $height, $backgroundColor);
|
return $this->Pad($width, $height, $backgroundColor, $transparencyPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -668,12 +670,13 @@ class Image extends File implements Flushable {
|
|||||||
* @param Image_Backend $backend
|
* @param Image_Backend $backend
|
||||||
* @param integer $width The width to size to
|
* @param integer $width The width to size to
|
||||||
* @param integer $height The height to size to
|
* @param integer $height The height to size to
|
||||||
|
* @param integer $transparencyPercent Level of transparency
|
||||||
* @return Image_Backend
|
* @return Image_Backend
|
||||||
* @deprecated 4.0 Generate methods are no longer applicable
|
* @deprecated 4.0 Generate methods are no longer applicable
|
||||||
*/
|
*/
|
||||||
public function generatePaddedImage(Image_Backend $backend, $width, $height, $backgroundColor='FFFFFF') {
|
public function generatePaddedImage(Image_Backend $backend, $width, $height, $backgroundColor = 'FFFFFF', $transparencyPercent = 0) {
|
||||||
Deprecation::notice('4.0', 'Generate methods are no longer applicable');
|
Deprecation::notice('4.0', 'Generate methods are no longer applicable');
|
||||||
return $backend->paddedResize($width, $height, $backgroundColor);
|
return $backend->paddedResize($width, $height, $backgroundColor, $transparencyPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1045,7 +1048,7 @@ class Image extends File implements Flushable {
|
|||||||
|
|
||||||
protected function onBeforeDelete() {
|
protected function onBeforeDelete() {
|
||||||
$backend = Injector::inst()->createWithArgs(self::config()->backend, array(
|
$backend = Injector::inst()->createWithArgs(self::config()->backend, array(
|
||||||
Director::baseFolder()."/" . $this->Filename
|
Director::baseFolder()."/" . $this->Filename
|
||||||
));
|
));
|
||||||
$backend->onBeforeDelete($this);
|
$backend->onBeforeDelete($this);
|
||||||
|
|
||||||
|
@ -282,10 +282,10 @@ class ImageTest extends SapphireTest {
|
|||||||
|
|
||||||
public function testCacheFilename() {
|
public function testCacheFilename() {
|
||||||
$image = $this->objFromFixture('Image', 'imageWithoutTitle');
|
$image = $this->objFromFixture('Image', 'imageWithoutTitle');
|
||||||
$imageFirst = $image->Pad(200,200,'CCCCCC');
|
$imageFirst = $image->Pad(200,200,'CCCCCC', 0);
|
||||||
$imageFilename = $imageFirst->getFullPath();
|
$imageFilename = $imageFirst->getFullPath();
|
||||||
// Encoding of the arguments is duplicated from cacheFilename
|
// Encoding of the arguments is duplicated from cacheFilename
|
||||||
$neededPart = 'Pad' . Convert::base64url_encode(array(200,200,'CCCCCC'));
|
$neededPart = 'Pad' . Convert::base64url_encode(array(200,200,'CCCCCC', 0));
|
||||||
$this->assertContains($neededPart, $imageFilename, 'Filename for cached image is correctly generated');
|
$this->assertContains($neededPart, $imageFilename, 'Filename for cached image is correctly generated');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,7 +308,12 @@ class ImageTest extends SapphireTest {
|
|||||||
|
|
||||||
$imageThird = $imageSecond->Pad(600,600,'0F0F0F');
|
$imageThird = $imageSecond->Pad(600,600,'0F0F0F');
|
||||||
// Encoding of the arguments is duplicated from cacheFilename
|
// Encoding of the arguments is duplicated from cacheFilename
|
||||||
$argumentString = Convert::base64url_encode(array(600,600,'0F0F0F'));
|
$argumentString = Convert::base64url_encode(array(
|
||||||
|
600,
|
||||||
|
600,
|
||||||
|
'0F0F0F',
|
||||||
|
0
|
||||||
|
));
|
||||||
$this->assertNotNull($imageThird);
|
$this->assertNotNull($imageThird);
|
||||||
$this->assertContains($argumentString, $imageThird->getFullPath(),
|
$this->assertContains($argumentString, $imageThird->getFullPath(),
|
||||||
'Image contains background color for padded resizement');
|
'Image contains background color for padded resizement');
|
||||||
|
Loading…
Reference in New Issue
Block a user