我只是一个小型应用程序的初学者,用户在该应用程序上上传图像,它触发了一些exiftool,该工具从图像中提取并返回元数据。 我有兴趣从此响应中仅提取GPS位置信息,即仅提取纬度和经度值。目前,我将元数据存储在变量中并回显它。我有点被困在Php中,或者可能直接从shell响应中读取。
这是代码:
$path = getcwd();
$metadata = shell_exec("exiftool ".$target_file);
echo $metadata;
Shell响应: 我只想从中读取并返回“ GPS经度:29度44'23.10”“ E”。
ExifTool Version Number : 11.10 File Name : tree.jpg Directory : uploads File Size : 275 kB File Modification Date/Time : 2018:09:15 14:13:45-07:00 File Access Date/Time : 2018:09:15 14:13:45-07:00 File Creation Date/Time : 2018:09:15 14:13:45-07:00 File Permissions : rw-rw-rw- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg Exif Byte Order : Little-endian (Intel, II) Make : Nokia Camera Model Name : C5-00.2 Orientation : Horizontal (normal) X Resolution : 300 Y Resolution : 300 Resolution Unit : inches Y Cb Cr Positioning : Centered Warning : Suspicious ExifIFD offset for ExposureTime F Number : 2.4 ISO : 100 Exif Version : . Date/Time Original : Create Date : 8 Components Configuration : Y, Cb, Cr, - Shutter Speed Value : 1/142 Aperture Value : 1.6 Light Source : Unknown Flash : Off, Did not fire Focal Length : 3.4 mm Sub Sec Time : 478 Sub Sec Time Original : 478 Sub Sec Time Digitized : 478 Flashpix Version : . Color Space : sRGB Exif Image Width : 1024 Exif Image Height : 768 Custom Rendered : Normal Exposure Mode : Auto White Balance : Auto Digital Zoom Ratio : 0.005786590576 Scene Capture Type : Standard Gain Control : None GPS Version ID : 8704 GPS Latitude Ref : North GPS Longitude Ref : East GPS Altitude Ref : Above Sea Level Compression : JPEG (old-style) Thumbnail Offset : 13818 Thumbnail Length : 14279 Image Width : 1024 Image Height : 768 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Aperture : 2.4 GPS Altitude : 50.4 m Above Sea Level GPS Longitude : 29 deg 44' 23.10" E Image Size : 1024x768 Megapixels : 0.786 Shutter Speed : 1/142 Thumbnail Image : (Binary data 14279 bytes, use -b option to extract) Focal Length : 3.4 mm Light Value : 9.7
谢谢。
答案 0 :(得分:1)
我制作了一个较小的字符串以显示操作。
str="Above Sea Level GPS Longitude : 29 deg 44' 23.10\" E Image Size :"
# Think about what makes your substring
echo "${str}"| sed -r 's/.*(GPS Longitude.*" .).*/\1/'
# or
echo "${str}"| grep -Eo 'GPS Longitude.*" .'
答案 1 :(得分:0)
我不确定您希望它如何工作,但是如果字符串中始终存在“ GPS经度”,则可以explode()并进行遍历以查找要查找的字段。
$exploded_string = explode(" ", $metadata);
$size_exploded = count(exploded_string); //or you could use sizeof()
$gps_long = "";
for ($i = 0; $i < $size_exploded; $i++){
if (($exploded_string[$i] == "GPS") && ($exploded_string[$i+1] == "Longitude")){
$gps_long = array_slice($exploded_string, $i, 8); //this will have the longitude
break;
}
}
这是硬编码方式,但是如果元数据以换行符分隔的每个属性出现,则可以更改。老实说,这是一种可怕的方式,但是我没有什么可做的。
答案 2 :(得分:0)
无论如何:
#-- split key:value fields from shell output
$text = implode("\n", $result); # array to string
preg_match_all("/^
(\w.+?) # label
\s*:\s* # :
(.+) \s* # value
$/mix", $text, $matches
);
$map = array_combine($matches[1], $matches[2]); # key=>value
print_r($map);
收益:
Array
(
[ExifTool Version Number] => 11.10
[File Name] => tree.jpg
[Directory] => uploads
...
)