Skip to content

Commit ec2e8f0

Browse files
committed
Add optional auto-orient support for IM strategies
1 parent 7701cc2 commit ec2e8f0

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

application/config/config.ini.changeme

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ mail.transport.type = "Sendmail"
265265
;
266266
; fileDerivatives.strategyOptions.page = "0"
267267
; fileDerivatives.strategyOptions.gravity = "center"
268+
; fileDerivatives.strategyOptions.autoOrient = false
268269

269270
; fileDerivatives.typeWhitelist[]
270271
; If set, Omeka will only attempt to create derivatives for files with the

application/libraries/Omeka/File/Derivative/Strategy/ExternalImageMagick.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ protected function _getConvertArgs($type, $constraint)
9696
$version = $this->getOption('version', '0');
9797

9898
if ($type != 'square_thumbnail') {
99-
return '-background white +repage -flatten -thumbnail ' . escapeshellarg("{$constraint}x{$constraint}>");
99+
$args = array(
100+
'-background white',
101+
'+repage',
102+
'-flatten',
103+
'-thumbnail ' . escapeshellarg("{$constraint}x{$constraint}>")
104+
);
100105
} else {
101106
$gravity = $this->getOption('gravity', 'Center');
102107
// Native square thumbnail resize requires at least version 6.3.8-3.
@@ -123,8 +128,12 @@ protected function _getConvertArgs($type, $constraint)
123128
'+repage'
124129
);
125130
}
126-
return join (' ', $args);
127131
}
132+
133+
if ($this->getOption('autoOrient', false)) {
134+
array_unshift($args, '-auto-orient');
135+
}
136+
return join (' ', $args);
128137
}
129138

130139
/**

application/libraries/Omeka/File/Derivative/Strategy/Imagick.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public function createImage($sourcePath, $destPath, $type, $sizeConstraint, $mim
4141
return false;
4242
}
4343

44+
if ($this->getOption('autoOrient', false)) {
45+
$this->_autoOrient($imagick);
46+
}
47+
4448
$origX = $imagick->getImageWidth();
4549
$origY = $imagick->getImageHeight();
4650

@@ -137,4 +141,39 @@ protected function _getCropOffsetY($resizedY, $sizeConstraint)
137141
return (int) (($resizedY - $sizeConstraint) / 2);
138142
}
139143
}
144+
145+
protected function _autoOrient($imagick)
146+
{
147+
$orientation = $imagick->getImageOrientation();
148+
$white = new ImagickPixel('#fff');
149+
switch ($orientation) {
150+
case Imagick::ORIENTATION_RIGHTTOP:
151+
$imagick->rotateImage($white, 90);
152+
break;
153+
case Imagick::ORIENTATION_BOTTOMRIGHT:
154+
$imagick->rotateImage($white, 180);
155+
break;
156+
case Imagick::ORIENTATION_LEFTBOTTOM:
157+
$imagick->rotateImage($white, 270);
158+
break;
159+
case Imagick::ORIENTATION_TOPRIGHT:
160+
$imagick->flopImage();
161+
break;
162+
case Imagick::ORIENTATION_RIGHTBOTTOM:
163+
$imagick->flopImage();
164+
$imagick->rotateImage($white, 90);
165+
break;
166+
case Imagick::ORIENTATION_BOTTOMLEFT:
167+
$imagick->flopImage();
168+
$imagick->rotateImage($white, 180);
169+
break;
170+
case Imagick::ORIENTATION_LEFTTOP:
171+
$imagick->flopImage();
172+
$imagick->rotateImage($white, 270);
173+
break;
174+
case Imagick::ORIENTATION_TOPLEFT:
175+
default:
176+
break;
177+
}
178+
}
140179
}

0 commit comments

Comments
 (0)