forked from leftypol/leftypol
MagickImageMetadataReader.php: update to read exif orientation
This commit is contained in:
parent
a683ce2bf8
commit
2ff248cd3b
1 changed files with 42 additions and 13 deletions
|
@ -1,41 +1,70 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Vichan\Service\Media;
|
namespace Vichan\Service\Media;
|
||||||
|
|
||||||
use Vichan\Data\ImageMetadataResult;
|
use Vichan\Data\{Exif, ImageMetadataResult};
|
||||||
use Mimey\MimeTypes;
|
use Vichan\Functions\Mime;
|
||||||
|
|
||||||
|
|
||||||
class MagickImageMetadataReader implements ImageMetadataReader {
|
class MagickImageMetadataReader implements ImageMetadataReader {
|
||||||
private string $prefix;
|
private string $prefix;
|
||||||
private MimeTypes $mime_types;
|
|
||||||
|
|
||||||
|
|
||||||
public static function createImageMagickReader(MimeTypes $mime_types): MagickImageMetadataReader {
|
private static function parseOrientation(string $str): ?int {
|
||||||
return new self('', $mime_types);
|
switch ($str) {
|
||||||
|
case 'Undefined':
|
||||||
|
return Exif::EXIF_ORIENTATION_UNDEFINED;
|
||||||
|
case 'TopLeft':
|
||||||
|
return Exif::EXIF_ORIENTATION_0_UPRIGHT;
|
||||||
|
case 'TopRight':
|
||||||
|
return Exif::EXIF_ORIENTATION_0_FLIPPED;
|
||||||
|
case 'BottomRight':
|
||||||
|
return Exif::EXIF_ORIENTATION_180_UPRIGHT;
|
||||||
|
case 'BottomLeft':
|
||||||
|
return Exif::EXIF_ORIENTATION_180_FLIPPED;
|
||||||
|
case 'LeftTop':
|
||||||
|
return Exif::EXIF_ORIENTATION_90_UPRIGHT;
|
||||||
|
case 'RightTop':
|
||||||
|
return Exif::EXIF_ORIENTATION_90_FLIPPED;
|
||||||
|
case 'RightBottom':
|
||||||
|
return Exif::EXIF_ORIENTATION_270_UPRIGHT;
|
||||||
|
case 'LeftBottom':
|
||||||
|
return Exif::EXIF_ORIENTATION_270_FLIPPED;
|
||||||
|
case 'Unrecognized':
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function createGraphicsMagickReader(MimeTypes $mime_types): MagickImageMetadataReader {
|
public static function createImageMagickReader(): MagickImageMetadataReader {
|
||||||
return new self('gm ', $mime_types);
|
return new self('magick');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function __construct(string $prefix, MimeTypes $mime_types) {
|
public static function createGraphicsMagickReader(): MagickImageMetadataReader {
|
||||||
|
return new self('gm');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function __construct(string $prefix) {
|
||||||
$this->prefix = $prefix;
|
$this->prefix = $prefix;
|
||||||
$this->mime_types = $mime_types;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMetadata(string $file_path): ImageMetadataResult {
|
public function getMetadata(string $file_path): ImageMetadataResult {
|
||||||
$arg = \escapeshellarg("$file_path[0]");
|
$arg = \escapeshellarg("$file_path[0]");
|
||||||
$ret_exec = shell_exec_error("{$this->prefix}identify -format \"%w %h %m\" $arg");
|
$ret_exec = shell_exec_error("{$this->prefix} identify -format \"%w %h %m\" $arg");
|
||||||
|
|
||||||
if (!\is_string($ret_exec)) {
|
if (!\is_string($ret_exec)) {
|
||||||
throw new \RuntimeException("Error while executing identify");
|
throw new \RuntimeException("Error while executing identify");
|
||||||
}
|
}
|
||||||
$ret_match = \preg_match('/^(\d+) (\d+) ([\w\d]+)$/', $ret_exec, $m);
|
$ret_match = \preg_match('/^(\d+) (\d+) ([\w\d]+) ([\w]+)$/', $ret_exec, $m);
|
||||||
if (!$ret_match) {
|
if (!$ret_match) {
|
||||||
throw new \RuntimeException("Could not parse identify output");
|
throw new \RuntimeException("Could not parse identify output");
|
||||||
}
|
}
|
||||||
|
$width = $m[1];
|
||||||
|
$height = $m[2];
|
||||||
|
$ext = $m[3];
|
||||||
|
$orientation_str = $m[4];
|
||||||
|
|
||||||
$mime = $this->mime_types->getMimeType($m[3]) ?? 'application/octet-stream';
|
$mime = Mime\ext_to_mime($ext) ?? 'application/octet-stream';
|
||||||
return new ImageMetadataResult($m[1], $m[2], $mime);
|
$exif_orientation = self::parseOrientation($orientation_str);
|
||||||
|
return new ImageMetadataResult($width, $height, $mime, $exif_orientation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue