Gmagick does not like tempnam without file extension
leofeyer opened this issue · 10 comments
The resizer uses a temporary file for atomic write operations:
Lines 123 to 127 in 9cd4150
This temporary file, however, does not have a file extension, which leads to an No encode delegate for this image format (webp)
error in Gmagick on Ubuntu 16.04. The error did not occur in my dev environment on macOS.
Appending the file extension to the temporary file fixed the issue:
// Atomic write operation
$tmpPath = $this->filesystem->tempnam($dir, 'img');
$this->filesystem->chmod($tmpPath, 0666, umask());
// Append the file extension to the temporary file
rename($tmpPath, $tmpPath.'.'.$imagineOptions['format']);
$tmpPath .= '.'.$imagineOptions['format'];
$imagineImage->save($tmpPath, $imagineOptions);
$this->filesystem->rename($tmpPath, $path, true);
Not sure if there is a better way to accomplish this though.
This should’ve already been fixed in 55a770a I think. We now always set the $imagineOptions['format']
to make sure that the file extension has no effect.
The No encode delegate
message from GMagick seems strange to me in this case. 😕
55a770a does not fix the issue for me. If the temporary file does not have the .webp
extension, the error occurs. 🤷♂
I think this is a bug in Imagine or GMagick, see php-imagine/Imagine#732
Until php-imagine/Imagine#733 gets merged, we could fix it with the following code I think:
try {
$imagineImage->save($tmpPath, $imagineOptions);
} catch(\GmagickException $e) {
if (stripos($e->getMessage(), 'no encode delegate') === false) {
throw $e;
}
$gmagick = new \Gmagick();
$gmagick->newimage(1, 1, (new \GmagickPixel('#FFFFFF'))->getcolor(false));
$gmagick->setimageformat(strtoupper($imagineOptions['format']));
$gmagick->getImageBlob();
$imagineImage->save($tmpPath, $imagineOptions);
}
@leofeyer should I implement the bugfix from #67 (comment) ?
Yes please. 👍
See #70
I think we should keep this issue open though because we probably want to revert the fix once this issue is resolved in Imagine or Gmagick.
Definitely. 👍
Note to myself: Revert f246a59 once php-imagine/Imagine#733 got resolved.