Laravel Storage::get()不返回图像的exif数据

3pmvbmvn  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(153)

我尝试获取图像exif数据,以便使用图像干预定向功能。
唯一的问题是我无法使用Storage::get()读取exif数据
首先,我存储上传的图像如下:

$filename = uniqid().'.'.$file->getClientOriginalExtension();
$path = "images/$id/$filename";
Storage::put($path, File::get($file->getRealPath()));

在一个队列中,我正在阅读图像,做一些调整大小和上传到AWS:

$image = Image::make(Storage::disk('images')->get("$this->id/$file"));
            $image->orientate();
            $image->resize(null, 600, function ($constraint) {
                $constraint->aspectRatio();
            });
            $image->stream('jpg', 85);
Storage::put("images/$this->id/main/$file", $image);
$image->destroy();

图像确实会调整大小并上传到AWS,但唯一的问题是它会横向显示,所以似乎我无法使用以下命令读取exif数据:

Storage::disk('images')->get("$this->id/$file")

我已经跑了:php -m型|更多,我可以看到“exif”被列出,所以我在我的Laravel Forge DO服务器中有这个模块

bmp9r5qi

bmp9r5qi1#

通过以下命令安装Intervention\Image

composer require intervention/image

更新config/app.php

'providers' => [
    Intervention\Image\ImageServiceProvider::class
],
'aliases' => [
    'Image' => Intervention\Image\Facades\Image::class
]

使用资源库:

$data = Image::make(public_path('IMG.jpg'))->exif();

if (isset($data['GPSLatitude'])) {
    $lat = eval('return ' . $data['GPSLatitude'][0] . ';')
        + (eval('return ' . $data['GPSLatitude'][1] . ';') / 60)
        + (eval('return ' . $data['GPSLatitude'][2] . ';') / 3600);

    $lng = eval('return ' . $data['GPSLongitude'][0] . ';')
        + (eval('return ' . $data['GPSLongitude'][1] . ';') / 60)
        + (eval('return ' . $data['GPSLongitude'][2] . ';') / 3600);

    echo "$lat, $lng";
} else {
    echo "No GPS Info";
}
kyxcudwk

kyxcudwk2#

要从图像干预获取exif数据,必须运行exif()函数
这很简单,只要加上一句:

$image->exif();

函数exif()将返回数组()中的所有现有数据;
您可以将参数传递给exif()函数,该函数将以字符串形式返回一些信息,例如:$image->exif('model')
您可以在图片intervention website上了解更多信息

h79rfbju

h79rfbju3#

一些图像处理软件实际上会删除 meta数据。如果您安装了GD,但没有元数据,则它可能不存在。测试此问题的最佳方法是尝试另一个图像。

ibrsph3r

ibrsph3r4#

function getImageLocation($file)
    {
        try {
            if (is_file($file)) {
                $info = exif_read_data($file);
                if (isset($info['GPSLatitude']) && isset($info['GPSLongitude']) &&
                    isset($info['GPSLatitudeRef']) && isset($info['GPSLongitudeRef']) &&
                    in_array($info['GPSLatitudeRef'], array('E', 'W', 'N', 'S')) && in_array($info['GPSLongitudeRef'], array('E', 'W', 'N', 'S'))) {

                    $GPSLatitudeRef = strtolower(trim($info['GPSLatitudeRef']));
                    $GPSLongitudeRef = strtolower(trim($info['GPSLongitudeRef']));

                    $lat_degrees_a = explode('/', $info['GPSLatitude'][0]);
                    $lat_minutes_a = explode('/', $info['GPSLatitude'][1]);
                    $lat_seconds_a = explode('/', $info['GPSLatitude'][2]);
                    $lng_degrees_a = explode('/', $info['GPSLongitude'][0]);
                    $lng_minutes_a = explode('/', $info['GPSLongitude'][1]);
                    $lng_seconds_a = explode('/', $info['GPSLongitude'][2]);

                    $lat_degrees = $lat_degrees_a[0] / $lat_degrees_a[1];
                    $lat_minutes = $lat_minutes_a[0] / $lat_minutes_a[1];
                    $lat_seconds = $lat_seconds_a[0] / $lat_seconds_a[1];
                    $lng_degrees = $lng_degrees_a[0] / $lng_degrees_a[1];
                    $lng_minutes = $lng_minutes_a[0] / $lng_minutes_a[1];
                    $lng_seconds = $lng_seconds_a[0] / $lng_seconds_a[1];

                    $lat = (float)$lat_degrees + ((($lat_minutes * 60) + ($lat_seconds)) / 3600);
                    $lng = (float)$lng_degrees + ((($lng_minutes * 60) + ($lng_seconds)) / 3600);

                    //If the latitude is South, make it negative.
                    //If the longitude is west, make it negative
                    $GPSLatitudeRef == 's' ? $lat *= -1 : '';
                    $GPSLongitudeRef == 'w' ? $lng *= -1 : '';

                    return ['latitude' => $lat, 'longitude' => $lng];
                }
            }
            return ['latitude' => null, 'longitude' => null];
        } catch (\Exception $e) {
            return ['latitude' => null, 'longitude' => null];
        }
    }

相关问题