如何在Oracle 12c中通过PL/SQL从BLOB列提取EXIF地理元数据?
我正尝试通过PL/SQL从Oracle Database 12c的BLOB列中存储的JPEG图片的EXIF元数据里提取地理信息。已安装Oracle Multimedia包,图片上传前包含地理定位数据,从BLOB下载后元数据中仍存在经纬度,但在数据库中读取时仅能获取图片宽高、大小、MIME类型等基础元数据。
我使用以下PL/SQL过程提取BLOB列的元数据:
PROCEDURE extractMetadata(inID IN INTEGER) IS img ORDSYS.ORDIMAGE; metav XMLSequenceType; meta_root VARCHAR2(40); xmlORD XMLType; xmlXMP XMLType; xmlEXIF XMLType; xmlIPTC XMLType; BEGIN -- select the image SELECT ordsys.ordimage(d.blob,1) INTO img FROM PHOTOS d WHERE d.id = inID; -- extract all the metadata metav := img.getMetadata( 'ALL' ); -- process the result array to discover what types of metadata were returned FOR i IN 1..metav.count() LOOP meta_root := metav(i).getRootElement(); DBMS_OUTPUT.PUT_LINE(meta_root); CASE meta_root WHEN 'ordImageAttributes' THEN xmlORD := metav(i); WHEN 'xmpMetadata' THEN xmlXMP := metav(i); WHEN 'iptcMetadata' THEN xmlIPTC := metav(i); WHEN 'exifMetadata' THEN xmlEXIF := metav(i); ELSE NULL; END CASE; END LOOP; -- Update metadata columns -- update photos SET metaORDImage = xmlORD, metaEXIF = xmlEXIF, metaIPTC = xmlIPTC, metaXMP = xmlXMP WHERE id = inID; END extractMetadata;
但仅能提取metaORDImage,无法获取EXIF元数据。将图片下载到本地查看详情时,地理数据存在;用Javascript库exif-js在网页加载图片时也能读取到完整元数据,示例如下:
{ "ImageWidth": 720, "ImageHeight": 1520, "ExifIFDPointer": 74, "Orientation": 0, "GPSInfoIFDPointer": 92, "LightSource": "Unknown", "GPSLatitude": [ 43, xx, 17.861 ], "GPSLatitudeRef": "N", "GPSLongitudeRef": "E", "GPSLongitude": [ 17, xx, 7.29 ], "thumbnail": {} }
请问问题出在哪里?是否可以从BLOB中提取EXIF元数据?是否需要将图片存储为其他格式而非BLOB?
Oracle Multimedia的EXIF解析限制:Oracle 12c的
ORDIMAGE.getMetadata方法对EXIF元数据的解析存在兼容性问题,尤其是针对存储在扩展IFD中的GPS信息等非标准或附加标签,部分场景下只会提取基础EXIF字段,忽略GPS这类扩展元数据。调整ORDIMAGE初始化方式:当前使用
ordsys.ordimage(d.blob,1)初始化对象,第二个参数source_type值为1对应本地文件,但此处读取的是BLOB列,建议尝试省略第二个参数,直接用ordsys.ordimage(d.blob)初始化,确保对象正确识别BLOB来源的图片数据。手动解析BLOB中的EXIF数据:如果Oracle Multimedia的方法无法满足需求,可通过PL/SQL手动解析BLOB的二进制内容提取EXIF信息。EXIF数据位于JPEG文件的
FFE1标记后的APP1段中,遵循TIFF格式规范,可编写PL/SQL函数定位该段,解析其中的GPS标签(标签编号0x0001至0x001F)。无需更换存储格式:BLOB完全可以存储包含完整EXIF元数据的图片,问题出在Oracle Multimedia的解析逻辑,而非存储格式本身。
内容的提问来源于stack exchange,提问作者darkvarK

