import 'dart:typed_data'; import 'package:vid/us/vid_us_data_reader.dart'; import 'package:vid/us/vid_us_image_data.dart'; import 'vid_tag.dart'; import 'vid_value.dart'; import 'vid_value_element.dart'; extension VidExtendedDataExt on VidUsImageData { /// 获取结构化扩展数据 VidExtendedData? getStructExtendedData() { return VidExtendedData.fromBytes(extendedData); } } /// vid文件扩展数据实体 class VidExtendedData { /// version tag static VidTag get versionTag => VidTag("Vid", "Version"); /// version num static VidIntegerValueElement get versionValue => VidIntegerValueElement(1); late final Map data; VidExtendedData(Map tv) { data = tv; add(versionTag, versionValue); } void add(VidTag key, IVidValue value) { data[key] = value; } static VidExtendedData? fromBytes(Uint8List bytes) { if (bytes.isEmpty) return null; try { final reader = VidUsDataReader(bytes); final count = reader.readInt(); if (count <= 0 || count > bytes.length) return null; final Map map = {}; for (int cursor = 0; cursor < count; cursor++) { final key = reader.readString(); final keys = key.split(','); if (keys.length != 3) { return null; } final vidTag = VidTag(keys[0], keys[1]); final valueStr = reader.readString(); final valueTypeName = keys[2].toLowerCase(); final valueType = ValueType.values .firstWhere((e) => e.name.toLowerCase() == valueTypeName); final vidValue = _convertStr2ValEle(valueType, valueStr); map[vidTag] = vidValue; } return VidExtendedData(map); } catch (e) {} return null; } static IVidValue _convertStr2ValEle(ValueType type, String value) { switch (type) { case ValueType.string: return VidStringValueElement(value); case ValueType.double: return VidDoubleValueElement(double.parse(value)); case ValueType.float: return VidFloatValueElement(double.parse(value)); case ValueType.integer: return VidIntegerValueElement(int.parse(value)); case ValueType.long: return VidLongValueElement(int.parse(value)); case ValueType.uint: return VidUintValueElement(int.parse(value)); case ValueType.ulong: return VidUlongValueElement(int.parse(value)); case ValueType.ushort: return VidUshortValueElement(int.parse(value)); case ValueType.byte: return VidByteValueElement(int.parse(value)); case ValueType.short: return VidShortValueElement(int.parse(value)); } } }