@sswroom/sswr 1.6.9 → 1.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Changelog +15 -0
- package/cert.d.ts +11 -11
- package/cert.js +151 -53
- package/certutil.d.ts +4 -4
- package/data.d.ts +5 -0
- package/data.js +90 -0
- package/dummy/olayer2.d.ts +2329 -0
- package/dummy/olayer2.js +2 -0
- package/media.d.ts +5 -0
- package/media.js +1861 -37
- package/olayer2.js +32 -10
- package/package.json +1 -1
- package/text.d.ts +2 -0
- package/text.js +23 -0
- package/web.js +10 -2
package/media.js
CHANGED
|
@@ -1307,7 +1307,7 @@ export class EXIFData
|
|
|
1307
1307
|
let ret = [];
|
|
1308
1308
|
let i;
|
|
1309
1309
|
for (i in this.exifMap)
|
|
1310
|
-
ret.push(i);
|
|
1310
|
+
ret.push(Number(i));
|
|
1311
1311
|
return ret;
|
|
1312
1312
|
}
|
|
1313
1313
|
|
|
@@ -1319,11 +1319,20 @@ export class EXIFData
|
|
|
1319
1319
|
return EXIFType.Unknown;
|
|
1320
1320
|
}
|
|
1321
1321
|
|
|
1322
|
+
/**
|
|
1323
|
+
*
|
|
1324
|
+
* @param {number} id
|
|
1325
|
+
* @returns {EXIFItem|null}
|
|
1326
|
+
*/
|
|
1322
1327
|
getExifItem(id)
|
|
1323
1328
|
{
|
|
1324
1329
|
return this.exifMap[id];
|
|
1325
1330
|
}
|
|
1326
1331
|
|
|
1332
|
+
/**
|
|
1333
|
+
*
|
|
1334
|
+
* @param {number} id
|
|
1335
|
+
*/
|
|
1327
1336
|
getExifUInt16(id)
|
|
1328
1337
|
{
|
|
1329
1338
|
let item = this.exifMap[id];
|
|
@@ -1563,7 +1572,9 @@ export class EXIFData
|
|
|
1563
1572
|
{
|
|
1564
1573
|
let subExif = this.getExifSubexif(34853);
|
|
1565
1574
|
if (subExif == null)
|
|
1575
|
+
{
|
|
1566
1576
|
return null;
|
|
1577
|
+
}
|
|
1567
1578
|
|
|
1568
1579
|
let ret = {};
|
|
1569
1580
|
let item1;
|
|
@@ -1587,11 +1598,13 @@ export class EXIFData
|
|
|
1587
1598
|
}
|
|
1588
1599
|
else
|
|
1589
1600
|
{
|
|
1601
|
+
console.log("Latitude length is not valid");
|
|
1590
1602
|
return null;
|
|
1591
1603
|
}
|
|
1592
1604
|
}
|
|
1593
1605
|
else
|
|
1594
1606
|
{
|
|
1607
|
+
console.log("Latitude type not valid");
|
|
1595
1608
|
return null;
|
|
1596
1609
|
}
|
|
1597
1610
|
if (item1.type == EXIFType.STRING)
|
|
@@ -1603,12 +1616,14 @@ export class EXIFData
|
|
|
1603
1616
|
}
|
|
1604
1617
|
else
|
|
1605
1618
|
{
|
|
1619
|
+
console.log("LatitudeRef type not valid");
|
|
1606
1620
|
return null;
|
|
1607
1621
|
}
|
|
1608
1622
|
ret.lat = val;
|
|
1609
1623
|
}
|
|
1610
1624
|
else
|
|
1611
1625
|
{
|
|
1626
|
+
console.log("Latitude / LatitudeRef not found");
|
|
1612
1627
|
return null;
|
|
1613
1628
|
}
|
|
1614
1629
|
item1 = subExif.getExifItem(3);
|
|
@@ -1629,11 +1644,13 @@ export class EXIFData
|
|
|
1629
1644
|
}
|
|
1630
1645
|
else
|
|
1631
1646
|
{
|
|
1647
|
+
console.log("Longitude length is not valid");
|
|
1632
1648
|
return null;
|
|
1633
1649
|
}
|
|
1634
1650
|
}
|
|
1635
1651
|
else
|
|
1636
1652
|
{
|
|
1653
|
+
console.log("Longitude type not valid");
|
|
1637
1654
|
return null;
|
|
1638
1655
|
}
|
|
1639
1656
|
if (item1.type == EXIFType.STRING)
|
|
@@ -1645,12 +1662,14 @@ export class EXIFData
|
|
|
1645
1662
|
}
|
|
1646
1663
|
else
|
|
1647
1664
|
{
|
|
1665
|
+
console.log("LongitudeRef type not valid");
|
|
1648
1666
|
return null;
|
|
1649
1667
|
}
|
|
1650
1668
|
ret.lon = val;
|
|
1651
1669
|
}
|
|
1652
1670
|
else
|
|
1653
1671
|
{
|
|
1672
|
+
console.log("Longitude / LongitudeRef not found");
|
|
1654
1673
|
return null;
|
|
1655
1674
|
}
|
|
1656
1675
|
item1 = subExif.getExifItem(5);
|
|
@@ -1665,11 +1684,13 @@ export class EXIFData
|
|
|
1665
1684
|
}
|
|
1666
1685
|
else
|
|
1667
1686
|
{
|
|
1687
|
+
console.log("Altitude length is not valid");
|
|
1668
1688
|
return null;
|
|
1669
1689
|
}
|
|
1670
1690
|
}
|
|
1671
1691
|
else
|
|
1672
1692
|
{
|
|
1693
|
+
console.log("Altitude Type is not valid");
|
|
1673
1694
|
return null;
|
|
1674
1695
|
}
|
|
1675
1696
|
if (item1.type == EXIFType.Bytes && item1.data.length == 1)
|
|
@@ -1688,13 +1709,14 @@ export class EXIFData
|
|
|
1688
1709
|
}
|
|
1689
1710
|
else
|
|
1690
1711
|
{
|
|
1691
|
-
|
|
1712
|
+
console.log("AltitudeRef Type is not valid");
|
|
1713
|
+
return null;
|
|
1692
1714
|
}
|
|
1693
1715
|
ret.altitude = val;
|
|
1694
1716
|
}
|
|
1695
1717
|
else
|
|
1696
1718
|
{
|
|
1697
|
-
ret.altitude =
|
|
1719
|
+
ret.altitude = null;
|
|
1698
1720
|
}
|
|
1699
1721
|
item1 = subExif.getExifItem(7);
|
|
1700
1722
|
item2 = subExif.getExifItem(29);
|
|
@@ -1709,6 +1731,7 @@ export class EXIFData
|
|
|
1709
1731
|
{
|
|
1710
1732
|
if (item1.data[1] != 1 || item1.data[3] != 1)
|
|
1711
1733
|
{
|
|
1734
|
+
console.log("GPSTime denominator is not valid");
|
|
1712
1735
|
return null;
|
|
1713
1736
|
}
|
|
1714
1737
|
else
|
|
@@ -1722,13 +1745,15 @@ export class EXIFData
|
|
|
1722
1745
|
}
|
|
1723
1746
|
else
|
|
1724
1747
|
{
|
|
1748
|
+
console.log("GPSTime Type is not valid");
|
|
1725
1749
|
return null;
|
|
1726
1750
|
}
|
|
1727
|
-
if (item2.type == EXIFType.STRING && item2.data.length
|
|
1751
|
+
if (item2.type == EXIFType.STRING && item2.data.length >= 10)
|
|
1728
1752
|
{
|
|
1729
1753
|
let dateArr = item2.data.split(":");
|
|
1730
1754
|
if (dateArr.length != 3)
|
|
1731
1755
|
{
|
|
1756
|
+
console.log("GPSDate is not valid");
|
|
1732
1757
|
return null;
|
|
1733
1758
|
}
|
|
1734
1759
|
else
|
|
@@ -1741,12 +1766,13 @@ export class EXIFData
|
|
|
1741
1766
|
tv.minute = mm;
|
|
1742
1767
|
tv.second = ss;
|
|
1743
1768
|
tv.nanosec = Math.floor(ms * 1000000000);
|
|
1744
|
-
tv.tzQhr =
|
|
1769
|
+
tv.tzQhr = 0;
|
|
1745
1770
|
ret.gpsTime = data.Timestamp.fromTimeValue(tv);
|
|
1746
1771
|
}
|
|
1747
1772
|
}
|
|
1748
1773
|
else
|
|
1749
1774
|
{
|
|
1775
|
+
console.log("GPSDate format is not valid", item2.data);
|
|
1750
1776
|
return null;
|
|
1751
1777
|
}
|
|
1752
1778
|
}
|
|
@@ -1764,7 +1790,7 @@ export class EXIFData
|
|
|
1764
1790
|
for (i in this.exifMap)
|
|
1765
1791
|
{
|
|
1766
1792
|
item = this.exifMap[i];
|
|
1767
|
-
name = EXIFData.getEXIFName(this.exifMaker,
|
|
1793
|
+
name = EXIFData.getEXIFName(this.exifMaker, i, id);
|
|
1768
1794
|
if (item.type == EXIFType.SubExif)
|
|
1769
1795
|
{
|
|
1770
1796
|
ret[name] = item.data.getProperties(i);
|
|
@@ -1789,6 +1815,1791 @@ export class EXIFData
|
|
|
1789
1815
|
return ret;
|
|
1790
1816
|
}
|
|
1791
1817
|
|
|
1818
|
+
toString(linePrefix)
|
|
1819
|
+
{
|
|
1820
|
+
let sb = [];
|
|
1821
|
+
let exItem;
|
|
1822
|
+
let i;
|
|
1823
|
+
let j;
|
|
1824
|
+
let k;
|
|
1825
|
+
let v;
|
|
1826
|
+
|
|
1827
|
+
sb.push("EXIF Content:");
|
|
1828
|
+
let exifIds = this.getExifIds();
|
|
1829
|
+
i = 0;
|
|
1830
|
+
j = exifIds.length;
|
|
1831
|
+
while (i < j)
|
|
1832
|
+
{
|
|
1833
|
+
v = exifIds[i];
|
|
1834
|
+
sb.push("\r\n");
|
|
1835
|
+
if (linePrefix) sb.push(linePrefix);
|
|
1836
|
+
sb.push("Id = ");
|
|
1837
|
+
sb.push(v);
|
|
1838
|
+
sb.push(", name = ");
|
|
1839
|
+
sb.push(EXIFData.getEXIFName(this.exifMaker, v));
|
|
1840
|
+
if ((exItem = this.getExifItem(v)) != null)
|
|
1841
|
+
{
|
|
1842
|
+
if (exItem.type == EXIFType.SubExif)
|
|
1843
|
+
{
|
|
1844
|
+
let i2;
|
|
1845
|
+
let j2;
|
|
1846
|
+
let v2;
|
|
1847
|
+
let subExItem;
|
|
1848
|
+
let subExif = exItem.data;
|
|
1849
|
+
let subExIds = subExif.getExifIds();
|
|
1850
|
+
i2 = 0;
|
|
1851
|
+
j2 = subExIds.length;
|
|
1852
|
+
while (i2 < j2)
|
|
1853
|
+
{
|
|
1854
|
+
v2 = subExIds[i2];
|
|
1855
|
+
sb.push("\r\n");
|
|
1856
|
+
if (linePrefix) sb.push(linePrefix);
|
|
1857
|
+
sb.push(" Subid = ");
|
|
1858
|
+
sb.push(v2);
|
|
1859
|
+
sb.push(", name = ");
|
|
1860
|
+
sb.push(EXIFData.getEXIFName(this.exifMaker, v2, v));
|
|
1861
|
+
|
|
1862
|
+
if ((subExItem = subExif.getExifItem(v2)) != null)
|
|
1863
|
+
{
|
|
1864
|
+
if (subExItem.type == EXIFType.STRING)
|
|
1865
|
+
{
|
|
1866
|
+
sb.push(", value = ");
|
|
1867
|
+
sb.push(subExItem.data);
|
|
1868
|
+
}
|
|
1869
|
+
else if (subExItem.type == EXIFType.Double)
|
|
1870
|
+
{
|
|
1871
|
+
let valBuff = subExItem.data;
|
|
1872
|
+
k = 0;
|
|
1873
|
+
while (k < valBuff.length)
|
|
1874
|
+
{
|
|
1875
|
+
if (k == 0)
|
|
1876
|
+
{
|
|
1877
|
+
sb.push(", value = ");
|
|
1878
|
+
}
|
|
1879
|
+
else
|
|
1880
|
+
{
|
|
1881
|
+
sb.push(", ");
|
|
1882
|
+
}
|
|
1883
|
+
sb.push(valBuff[k]);
|
|
1884
|
+
k++;
|
|
1885
|
+
}
|
|
1886
|
+
}
|
|
1887
|
+
else if (subExItem.type == EXIFType.Bytes)
|
|
1888
|
+
{
|
|
1889
|
+
let valBuff = subExItem.data;
|
|
1890
|
+
sb.push(", value = ");
|
|
1891
|
+
if (valBuff.length > 1024)
|
|
1892
|
+
{
|
|
1893
|
+
sb.push(valBuff.length);
|
|
1894
|
+
sb.push(" bytes: ");
|
|
1895
|
+
sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, 0, 256), ' ', "\r\n"));
|
|
1896
|
+
sb.push("\r\n...\r\n");
|
|
1897
|
+
sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, (valBuff.length & ~15) - 256, 256 + (valBuff.length & 15)), ' ', "\r\n"));
|
|
1898
|
+
}
|
|
1899
|
+
else
|
|
1900
|
+
{
|
|
1901
|
+
sb.push(text.u8Arr2Hex(new Uint8Array(valBuff), ' ', "\r\n"));
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
else if (subExItem.type == EXIFType.UINT16)
|
|
1905
|
+
{
|
|
1906
|
+
let valBuff = subExItem.data;
|
|
1907
|
+
k = 0;
|
|
1908
|
+
while (k < valBuff.length)
|
|
1909
|
+
{
|
|
1910
|
+
if (k == 0)
|
|
1911
|
+
{
|
|
1912
|
+
sb.push(", value = ");
|
|
1913
|
+
}
|
|
1914
|
+
else
|
|
1915
|
+
{
|
|
1916
|
+
sb.push(", ");
|
|
1917
|
+
}
|
|
1918
|
+
sb.push(valBuff[k]);
|
|
1919
|
+
k++;
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
else if (subExItem.type == EXIFType.UINT32)
|
|
1923
|
+
{
|
|
1924
|
+
let valBuff = subExItem.data;
|
|
1925
|
+
k = 0;
|
|
1926
|
+
while (k < valBuff.length)
|
|
1927
|
+
{
|
|
1928
|
+
if (k == 0)
|
|
1929
|
+
{
|
|
1930
|
+
sb.push(", value = ");
|
|
1931
|
+
}
|
|
1932
|
+
else
|
|
1933
|
+
{
|
|
1934
|
+
sb.push(", ");
|
|
1935
|
+
}
|
|
1936
|
+
sb.push(valBuff[k]);
|
|
1937
|
+
k++;
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
else if (subExItem.type == EXIFType.Rational)
|
|
1941
|
+
{
|
|
1942
|
+
let valBuff = subExItem.data;
|
|
1943
|
+
k = 0;
|
|
1944
|
+
while (k < valBuff.length)
|
|
1945
|
+
{
|
|
1946
|
+
if (k == 0)
|
|
1947
|
+
{
|
|
1948
|
+
sb.push(", value = ");
|
|
1949
|
+
}
|
|
1950
|
+
else
|
|
1951
|
+
{
|
|
1952
|
+
sb.push(", ");
|
|
1953
|
+
}
|
|
1954
|
+
sb.push(valBuff[k]);
|
|
1955
|
+
sb.push(" / ");
|
|
1956
|
+
sb.push(valBuff[k + 1]);
|
|
1957
|
+
if (valBuff[k + 1] != 0)
|
|
1958
|
+
{
|
|
1959
|
+
sb.push(" (");
|
|
1960
|
+
sb.push(valBuff[k] / valBuff[k + 1]);
|
|
1961
|
+
sb.push(")");
|
|
1962
|
+
}
|
|
1963
|
+
k += 2;
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
else if (subExItem.type == EXIFType.SRational)
|
|
1967
|
+
{
|
|
1968
|
+
let valBuff = subExItem.data;
|
|
1969
|
+
k = 0;
|
|
1970
|
+
while (k < valBuff.length)
|
|
1971
|
+
{
|
|
1972
|
+
if (k == 0)
|
|
1973
|
+
{
|
|
1974
|
+
sb.push(", value = ");
|
|
1975
|
+
}
|
|
1976
|
+
else
|
|
1977
|
+
{
|
|
1978
|
+
sb.push(", ");
|
|
1979
|
+
}
|
|
1980
|
+
sb.push(valBuff[k]);
|
|
1981
|
+
sb.push(" / ");
|
|
1982
|
+
sb.push(valBuff[k + 1]);
|
|
1983
|
+
if (valBuff[k + 1] != 0)
|
|
1984
|
+
{
|
|
1985
|
+
sb.push(" (");
|
|
1986
|
+
sb.push(valBuff[k] / valBuff[k + 1]);
|
|
1987
|
+
sb.push(")");
|
|
1988
|
+
}
|
|
1989
|
+
k += 2;
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1992
|
+
else if (subExItem.type == EXIFType.INT16)
|
|
1993
|
+
{
|
|
1994
|
+
let valBuff = subExItem.data;
|
|
1995
|
+
k = 0;
|
|
1996
|
+
while (k < valBuff.length)
|
|
1997
|
+
{
|
|
1998
|
+
if (k == 0)
|
|
1999
|
+
{
|
|
2000
|
+
sb.push(", value = ");
|
|
2001
|
+
}
|
|
2002
|
+
else
|
|
2003
|
+
{
|
|
2004
|
+
sb.push(", ");
|
|
2005
|
+
}
|
|
2006
|
+
sb.push(valBuff[k]);
|
|
2007
|
+
k++;
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
else if (subExItem.type == EXIFType.INT32)
|
|
2011
|
+
{
|
|
2012
|
+
let valBuff = subExItem.data;
|
|
2013
|
+
k = 0;
|
|
2014
|
+
while (k < valBuff.length)
|
|
2015
|
+
{
|
|
2016
|
+
if (k == 0)
|
|
2017
|
+
{
|
|
2018
|
+
sb.push(", value = ");
|
|
2019
|
+
}
|
|
2020
|
+
else
|
|
2021
|
+
{
|
|
2022
|
+
sb.push(", ");
|
|
2023
|
+
}
|
|
2024
|
+
sb.push(valBuff[k]);
|
|
2025
|
+
k++;
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
else if (subExItem.id == 37500)
|
|
2029
|
+
{
|
|
2030
|
+
let valBuff = subExItem.data;
|
|
2031
|
+
let innerExif;
|
|
2032
|
+
let nnlinePrefix;
|
|
2033
|
+
if ((innerExif = this.parseMakerNote(valBuff)) != null)
|
|
2034
|
+
{
|
|
2035
|
+
sb.push(", Format = ");
|
|
2036
|
+
sb.push(innerExif.getEXIFMaker());
|
|
2037
|
+
sb.push(", Inner ");
|
|
2038
|
+
if (linePrefix)
|
|
2039
|
+
{
|
|
2040
|
+
sb.push(innerExif.toString(" "+linePrefix));
|
|
2041
|
+
}
|
|
2042
|
+
else
|
|
2043
|
+
{
|
|
2044
|
+
sb.push(innerExif.toString(" "));
|
|
2045
|
+
}
|
|
2046
|
+
}
|
|
2047
|
+
else
|
|
2048
|
+
{
|
|
2049
|
+
sb.push(", value (Other) = ");
|
|
2050
|
+
sb.push(text.u8Arr2Hex(valBuff, ' ', "\r\n"));
|
|
2051
|
+
}
|
|
2052
|
+
}
|
|
2053
|
+
else if (subExItem.type == EXIFType.Other)
|
|
2054
|
+
{
|
|
2055
|
+
let valBuff = subExItem.data;
|
|
2056
|
+
if (this.exifMaker == EXIFMaker.Olympus && subExItem.id == 0)
|
|
2057
|
+
{
|
|
2058
|
+
sb.push(", value = ");
|
|
2059
|
+
sb.push(valBuff); //////////////////
|
|
2060
|
+
}
|
|
2061
|
+
else
|
|
2062
|
+
{
|
|
2063
|
+
sb.push(", value (Other) = ");
|
|
2064
|
+
sb.push(text.u8Arr2Hex(valBuff, ' ', "\r\n"));
|
|
2065
|
+
}
|
|
2066
|
+
}
|
|
2067
|
+
else
|
|
2068
|
+
{
|
|
2069
|
+
let valBuff = subExItem.data;
|
|
2070
|
+
sb.push(", value (Unk) = ");
|
|
2071
|
+
sb.push(text.u8Arr2Hex(valBuff, ' ', "\r\n"));
|
|
2072
|
+
}
|
|
2073
|
+
}
|
|
2074
|
+
i2++;
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
else if (exItem.type == EXIFType.STRING)
|
|
2078
|
+
{
|
|
2079
|
+
sb.push(", value = ");
|
|
2080
|
+
sb.push(exItem.data);
|
|
2081
|
+
}
|
|
2082
|
+
else if (exItem.type == EXIFType.Double)
|
|
2083
|
+
{
|
|
2084
|
+
let valBuff = exItem.data;
|
|
2085
|
+
k = 0;
|
|
2086
|
+
while (k < valBuff.length)
|
|
2087
|
+
{
|
|
2088
|
+
if (k == 0)
|
|
2089
|
+
{
|
|
2090
|
+
sb.push(", value = ");
|
|
2091
|
+
}
|
|
2092
|
+
else
|
|
2093
|
+
{
|
|
2094
|
+
sb.push(", ");
|
|
2095
|
+
}
|
|
2096
|
+
sb.push(valBuff[k]);
|
|
2097
|
+
k++;
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
else if (exItem.type == EXIFType.Bytes)
|
|
2101
|
+
{
|
|
2102
|
+
let valBuff = exItem.data;
|
|
2103
|
+
sb.push(", value = ");
|
|
2104
|
+
if (exItem.id >= 40091 && exItem.id <= 40095)
|
|
2105
|
+
{
|
|
2106
|
+
let enc = new text.UTF16LETextBinEnc();
|
|
2107
|
+
if (valBuff[valBuff.length - 2] == 0)
|
|
2108
|
+
{
|
|
2109
|
+
sb.push(enc.encodeBin(new Uint8Array(valBuff, 0, valBuff.length - 2)));
|
|
2110
|
+
}
|
|
2111
|
+
else
|
|
2112
|
+
{
|
|
2113
|
+
sb.push(enc.encodeBin(new Uint8Array(valBuff, 0, valBuff.length)));
|
|
2114
|
+
}
|
|
2115
|
+
}
|
|
2116
|
+
else
|
|
2117
|
+
{
|
|
2118
|
+
if (exItem.data.length > 1024)
|
|
2119
|
+
{
|
|
2120
|
+
sb.push(exItem.data.length);
|
|
2121
|
+
sb.push(" bytes: ");
|
|
2122
|
+
sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, 0, 256), ' ', "\r\n"));
|
|
2123
|
+
sb.push("\r\n...\r\n");
|
|
2124
|
+
sb.push(text.u8Arr2Hex(new Uint8Array(valBuff, (valBuff.length & ~15) - 256, 256 + (valBuff.length & 15)), ' ', "\r\n"));
|
|
2125
|
+
}
|
|
2126
|
+
else
|
|
2127
|
+
{
|
|
2128
|
+
sb.push(text.u8Arr2Hex(new Uint8Array(valBuff), ' ', "\r\n"));
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
}
|
|
2132
|
+
else if (exItem.type == EXIFType.UINT16)
|
|
2133
|
+
{
|
|
2134
|
+
let valBuff = exItem.data;
|
|
2135
|
+
if (this.exifMaker == EXIFMaker.Canon && exItem.id == 1)
|
|
2136
|
+
{
|
|
2137
|
+
sb.push(this.toStringCanonCameraSettings(linePrefix, valBuff));
|
|
2138
|
+
}
|
|
2139
|
+
else if (this.exifMaker == EXIFMaker.Canon && exItem.id == 2)
|
|
2140
|
+
{
|
|
2141
|
+
sb.push(this.toStringCanonFocalLength(linePrefix, valBuff));
|
|
2142
|
+
}
|
|
2143
|
+
else if (this.exifMaker == EXIFMaker.Canon && exItem.id == 4)
|
|
2144
|
+
{
|
|
2145
|
+
sb.push(this.toStringCanonShotInfo(linePrefix, valBuff));
|
|
2146
|
+
}
|
|
2147
|
+
else
|
|
2148
|
+
{
|
|
2149
|
+
k = 0;
|
|
2150
|
+
while (k < valBuff.length)
|
|
2151
|
+
{
|
|
2152
|
+
if (k == 0)
|
|
2153
|
+
{
|
|
2154
|
+
sb.push(", value = ");
|
|
2155
|
+
}
|
|
2156
|
+
else
|
|
2157
|
+
{
|
|
2158
|
+
sb.push(", ");
|
|
2159
|
+
}
|
|
2160
|
+
sb.push(valBuff[k]);
|
|
2161
|
+
k++;
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2164
|
+
}
|
|
2165
|
+
else if (exItem.type == EXIFType.UINT32)
|
|
2166
|
+
{
|
|
2167
|
+
let valBuff = exItem.data;
|
|
2168
|
+
k = 0;
|
|
2169
|
+
while (k < valBuff.length)
|
|
2170
|
+
{
|
|
2171
|
+
if (k == 0)
|
|
2172
|
+
{
|
|
2173
|
+
sb.push(", value = ");
|
|
2174
|
+
}
|
|
2175
|
+
else
|
|
2176
|
+
{
|
|
2177
|
+
sb.push(", ");
|
|
2178
|
+
}
|
|
2179
|
+
sb.push(valBuff[k]);
|
|
2180
|
+
k++;
|
|
2181
|
+
}
|
|
2182
|
+
}
|
|
2183
|
+
else if (exItem.type == EXIFType.Rational)
|
|
2184
|
+
{
|
|
2185
|
+
let valBuff = exItem.data;
|
|
2186
|
+
k = 0;
|
|
2187
|
+
while (k < valBuff.length)
|
|
2188
|
+
{
|
|
2189
|
+
if (k == 0)
|
|
2190
|
+
{
|
|
2191
|
+
sb.push(", value = ");
|
|
2192
|
+
}
|
|
2193
|
+
else
|
|
2194
|
+
{
|
|
2195
|
+
sb.push(", ");
|
|
2196
|
+
}
|
|
2197
|
+
sb.push(valBuff[k]);
|
|
2198
|
+
sb.push(" / ");
|
|
2199
|
+
sb.push(valBuff[k + 1]);
|
|
2200
|
+
if (valBuff[k + 1] != 0)
|
|
2201
|
+
{
|
|
2202
|
+
sb.push(" (");
|
|
2203
|
+
sb.push(valBuff[k] / valBuff[k + 1]);
|
|
2204
|
+
sb.push(")");
|
|
2205
|
+
}
|
|
2206
|
+
k += 2;
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
else if (exItem.type == EXIFType.SRational)
|
|
2210
|
+
{
|
|
2211
|
+
let valBuff = exItem.data;
|
|
2212
|
+
k = 0;
|
|
2213
|
+
while (k < valBuff.length)
|
|
2214
|
+
{
|
|
2215
|
+
if (k == 0)
|
|
2216
|
+
{
|
|
2217
|
+
sb.push(", value = ");
|
|
2218
|
+
}
|
|
2219
|
+
else
|
|
2220
|
+
{
|
|
2221
|
+
sb.push(", ");
|
|
2222
|
+
}
|
|
2223
|
+
sb.push(valBuff[k]);
|
|
2224
|
+
sb.push(" / ");
|
|
2225
|
+
sb.push(valBuff[k + 1]);
|
|
2226
|
+
if (valBuff[k + 1] != 0)
|
|
2227
|
+
{
|
|
2228
|
+
sb.push(" (");
|
|
2229
|
+
sb.push(valBuff[k] / valBuff[k + 1]);
|
|
2230
|
+
sb.push(")");
|
|
2231
|
+
}
|
|
2232
|
+
k += 2;
|
|
2233
|
+
}
|
|
2234
|
+
}
|
|
2235
|
+
else if (exItem.type == EXIFType.INT16)
|
|
2236
|
+
{
|
|
2237
|
+
let valBuff = exItem.data;
|
|
2238
|
+
k = 0;
|
|
2239
|
+
while (k < valBuff.length)
|
|
2240
|
+
{
|
|
2241
|
+
if (k == 0)
|
|
2242
|
+
{
|
|
2243
|
+
sb.push(", value = ");
|
|
2244
|
+
}
|
|
2245
|
+
else
|
|
2246
|
+
{
|
|
2247
|
+
sb.push(", ");
|
|
2248
|
+
}
|
|
2249
|
+
sb.push(valBuff[k]);
|
|
2250
|
+
k++;
|
|
2251
|
+
}
|
|
2252
|
+
}
|
|
2253
|
+
else if (exItem.type == EXIFType.INT32)
|
|
2254
|
+
{
|
|
2255
|
+
let valBuff = exItem.data;
|
|
2256
|
+
k = 0;
|
|
2257
|
+
while (k < valBuff.length)
|
|
2258
|
+
{
|
|
2259
|
+
if (k == 0)
|
|
2260
|
+
{
|
|
2261
|
+
sb.push(", value = ");
|
|
2262
|
+
}
|
|
2263
|
+
else
|
|
2264
|
+
{
|
|
2265
|
+
sb.push(", ");
|
|
2266
|
+
}
|
|
2267
|
+
sb.push(valBuff[k]);
|
|
2268
|
+
k++;
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
else if (exItem.type == EXIFType.Other)
|
|
2272
|
+
{
|
|
2273
|
+
if (this.exifMaker == EXIFMaker.Olympus && exItem.id == 521)
|
|
2274
|
+
{
|
|
2275
|
+
sb.push(", value = ");
|
|
2276
|
+
sb.push(exItem.data);
|
|
2277
|
+
}
|
|
2278
|
+
else
|
|
2279
|
+
{
|
|
2280
|
+
// UInt8 *valBuff;
|
|
2281
|
+
// valBuff = (UInt8*)exItem->dataBuff;
|
|
2282
|
+
sb.push(", Other: size = ");
|
|
2283
|
+
sb.push(exItem.data.length);
|
|
2284
|
+
// sb->AppendHex(valBuff, subExItem->cnt, ' ', Text::StringBuilder::LBT_CRLF);
|
|
2285
|
+
}
|
|
2286
|
+
}
|
|
2287
|
+
else
|
|
2288
|
+
{
|
|
2289
|
+
/* UInt8 *valBuff;
|
|
2290
|
+
if (exItem->cnt <= 4)
|
|
2291
|
+
{
|
|
2292
|
+
valBuff = (UInt8*)&exItem->value;
|
|
2293
|
+
}
|
|
2294
|
+
else
|
|
2295
|
+
{
|
|
2296
|
+
valBuff = (UInt8*)exItem->dataBuff;
|
|
2297
|
+
}*/
|
|
2298
|
+
sb.push(", Unknown: size = ");
|
|
2299
|
+
sb.push(exItem.data.length);
|
|
2300
|
+
// sb->AppendHex(valBuff, subExItem->cnt, ' ', Text::StringBuilder::LBT_CRLF);
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
i++;
|
|
2304
|
+
}
|
|
2305
|
+
let loc;
|
|
2306
|
+
if ((loc = this.getPhotoLocation()) != null)
|
|
2307
|
+
{
|
|
2308
|
+
sb.push("\r\nGPS Location: ");
|
|
2309
|
+
sb.push(loc.lat);
|
|
2310
|
+
sb.push(", ");
|
|
2311
|
+
sb.push(loc.lon);
|
|
2312
|
+
sb.push(", ");
|
|
2313
|
+
sb.push(loc.altitude);
|
|
2314
|
+
}
|
|
2315
|
+
return sb.join("");
|
|
2316
|
+
}
|
|
2317
|
+
|
|
2318
|
+
toStringCanonCameraSettings(linePrefix, valBuff)
|
|
2319
|
+
{
|
|
2320
|
+
let sb = [];
|
|
2321
|
+
let isInt16;
|
|
2322
|
+
let isUInt16;
|
|
2323
|
+
let k;
|
|
2324
|
+
k = 0;
|
|
2325
|
+
while (k < valBuff.length)
|
|
2326
|
+
{
|
|
2327
|
+
sb.push("\r\n");
|
|
2328
|
+
if (linePrefix) sb.push(linePrefix);
|
|
2329
|
+
sb.push(" ");
|
|
2330
|
+
isInt16 = false;
|
|
2331
|
+
isUInt16 = false;
|
|
2332
|
+
switch (k)
|
|
2333
|
+
{
|
|
2334
|
+
case 1:
|
|
2335
|
+
sb.push("MacroMode = ");
|
|
2336
|
+
switch (valBuff[k])
|
|
2337
|
+
{
|
|
2338
|
+
case 1:
|
|
2339
|
+
sb.push("1-Macro");
|
|
2340
|
+
break;
|
|
2341
|
+
case 2:
|
|
2342
|
+
sb.push("2-Normal");
|
|
2343
|
+
break;
|
|
2344
|
+
default:
|
|
2345
|
+
sb.push(valBuff[k]);
|
|
2346
|
+
break;
|
|
2347
|
+
}
|
|
2348
|
+
break;
|
|
2349
|
+
case 2:
|
|
2350
|
+
sb.push("SelfTimer = ");
|
|
2351
|
+
isInt16 = true;
|
|
2352
|
+
break;
|
|
2353
|
+
case 3:
|
|
2354
|
+
sb.push("Quality = ");
|
|
2355
|
+
switch (valBuff[k])
|
|
2356
|
+
{
|
|
2357
|
+
case -1:
|
|
2358
|
+
sb.push("-1-n/a");
|
|
2359
|
+
break;
|
|
2360
|
+
case 1:
|
|
2361
|
+
sb.push("1-Economy");
|
|
2362
|
+
break;
|
|
2363
|
+
case 2:
|
|
2364
|
+
sb.push("2-Normal");
|
|
2365
|
+
break;
|
|
2366
|
+
case 3:
|
|
2367
|
+
sb.push("3-Fine");
|
|
2368
|
+
break;
|
|
2369
|
+
case 4:
|
|
2370
|
+
sb.push("4-RAW");
|
|
2371
|
+
break;
|
|
2372
|
+
case 5:
|
|
2373
|
+
sb.push("5-Superfine");
|
|
2374
|
+
break;
|
|
2375
|
+
case 7:
|
|
2376
|
+
sb.push("7-CRAW");
|
|
2377
|
+
break;
|
|
2378
|
+
case 130:
|
|
2379
|
+
sb.push("130-Normal Movie");
|
|
2380
|
+
break;
|
|
2381
|
+
case 131:
|
|
2382
|
+
sb.push("131-Movie (2)");
|
|
2383
|
+
break;
|
|
2384
|
+
default:
|
|
2385
|
+
sb.push(valBuff[k]);
|
|
2386
|
+
break;
|
|
2387
|
+
}
|
|
2388
|
+
break;
|
|
2389
|
+
case 4:
|
|
2390
|
+
sb.push("CanonFlashMode = ");
|
|
2391
|
+
switch (valBuff[k])
|
|
2392
|
+
{
|
|
2393
|
+
case -1:
|
|
2394
|
+
sb.push("-1-n/a");
|
|
2395
|
+
break;
|
|
2396
|
+
case 0:
|
|
2397
|
+
sb.push("0-Off");
|
|
2398
|
+
break;
|
|
2399
|
+
case 1:
|
|
2400
|
+
sb.push("1-Auto");
|
|
2401
|
+
break;
|
|
2402
|
+
case 2:
|
|
2403
|
+
sb.push("2-On");
|
|
2404
|
+
break;
|
|
2405
|
+
case 3:
|
|
2406
|
+
sb.push("3-Red-eye Reduction");
|
|
2407
|
+
break;
|
|
2408
|
+
case 4:
|
|
2409
|
+
sb.push("4-Slow Sync");
|
|
2410
|
+
break;
|
|
2411
|
+
case 5:
|
|
2412
|
+
sb.push("5-Red-eye Reduction (Auto)");
|
|
2413
|
+
break;
|
|
2414
|
+
case 6:
|
|
2415
|
+
sb.push("6-Red-eye Reduction (On)");
|
|
2416
|
+
break;
|
|
2417
|
+
case 16:
|
|
2418
|
+
sb.push("16-External Flash");
|
|
2419
|
+
break;
|
|
2420
|
+
default:
|
|
2421
|
+
sb.push(valBuff[k]);
|
|
2422
|
+
break;
|
|
2423
|
+
}
|
|
2424
|
+
break;
|
|
2425
|
+
case 5:
|
|
2426
|
+
sb.push("ContinuousDrive = ");
|
|
2427
|
+
switch (valBuff[k])
|
|
2428
|
+
{
|
|
2429
|
+
case 0:
|
|
2430
|
+
sb.push("0-Single");
|
|
2431
|
+
break;
|
|
2432
|
+
case 1:
|
|
2433
|
+
sb.push("1-Continuous");
|
|
2434
|
+
break;
|
|
2435
|
+
case 2:
|
|
2436
|
+
sb.push("2-Movie");
|
|
2437
|
+
break;
|
|
2438
|
+
case 3:
|
|
2439
|
+
sb.push("3-Continuous, Speed Priority");
|
|
2440
|
+
break;
|
|
2441
|
+
case 4:
|
|
2442
|
+
sb.push("4-Continuous, Low");
|
|
2443
|
+
break;
|
|
2444
|
+
case 5:
|
|
2445
|
+
sb.push("5-Continuous, High");
|
|
2446
|
+
break;
|
|
2447
|
+
case 6:
|
|
2448
|
+
sb.push("6-Silent Single");
|
|
2449
|
+
break;
|
|
2450
|
+
case 9:
|
|
2451
|
+
sb.push("9-Single, Silent");
|
|
2452
|
+
break;
|
|
2453
|
+
case 10:
|
|
2454
|
+
sb.push("10-Continuous, Silent");
|
|
2455
|
+
break;
|
|
2456
|
+
default:
|
|
2457
|
+
sb.push(valBuff[k]);
|
|
2458
|
+
break;
|
|
2459
|
+
}
|
|
2460
|
+
break;
|
|
2461
|
+
case 7:
|
|
2462
|
+
sb.push("FocusMode = ");
|
|
2463
|
+
switch (valBuff[k])
|
|
2464
|
+
{
|
|
2465
|
+
case 0:
|
|
2466
|
+
sb.push("0-One-shot AF");
|
|
2467
|
+
break;
|
|
2468
|
+
case 1:
|
|
2469
|
+
sb.push("1-AI Servo AF");
|
|
2470
|
+
break;
|
|
2471
|
+
case 2:
|
|
2472
|
+
sb.push("2-AI Focus AF");
|
|
2473
|
+
break;
|
|
2474
|
+
case 3:
|
|
2475
|
+
sb.push("3-Manual Focus");
|
|
2476
|
+
break;
|
|
2477
|
+
case 4:
|
|
2478
|
+
sb.push("4-Single");
|
|
2479
|
+
break;
|
|
2480
|
+
case 5:
|
|
2481
|
+
sb.push("5-Continuous");
|
|
2482
|
+
break;
|
|
2483
|
+
case 6:
|
|
2484
|
+
sb.push("6-Manual Focus");
|
|
2485
|
+
break;
|
|
2486
|
+
case 16:
|
|
2487
|
+
sb.push("16-Pan Focus");
|
|
2488
|
+
break;
|
|
2489
|
+
case 256:
|
|
2490
|
+
sb.push("256-AF+MF");
|
|
2491
|
+
break;
|
|
2492
|
+
case 512:
|
|
2493
|
+
sb.push("512-Movie Snap Focus");
|
|
2494
|
+
break;
|
|
2495
|
+
case 519:
|
|
2496
|
+
sb.push("519-Movie Servo AF");
|
|
2497
|
+
break;
|
|
2498
|
+
default:
|
|
2499
|
+
sb.push(valBuff[k]);
|
|
2500
|
+
break;
|
|
2501
|
+
}
|
|
2502
|
+
break;
|
|
2503
|
+
case 9:
|
|
2504
|
+
sb.push("RecordMode = ");
|
|
2505
|
+
switch (valBuff[k])
|
|
2506
|
+
{
|
|
2507
|
+
case 1:
|
|
2508
|
+
sb.push("1-JPEG");
|
|
2509
|
+
break;
|
|
2510
|
+
case 2:
|
|
2511
|
+
sb.push("2-CRW+THM");
|
|
2512
|
+
break;
|
|
2513
|
+
case 3:
|
|
2514
|
+
sb.push("3-AVI+THM");
|
|
2515
|
+
break;
|
|
2516
|
+
case 4:
|
|
2517
|
+
sb.push("4-TIF");
|
|
2518
|
+
break;
|
|
2519
|
+
case 5:
|
|
2520
|
+
sb.push("5-TIF+JPEG");
|
|
2521
|
+
break;
|
|
2522
|
+
case 6:
|
|
2523
|
+
sb.push("6-CR2");
|
|
2524
|
+
break;
|
|
2525
|
+
case 7:
|
|
2526
|
+
sb.push("7-CR2+JPEG");
|
|
2527
|
+
break;
|
|
2528
|
+
case 9:
|
|
2529
|
+
sb.push("9-MOV");
|
|
2530
|
+
break;
|
|
2531
|
+
case 10:
|
|
2532
|
+
sb.push("10-MP4");
|
|
2533
|
+
break;
|
|
2534
|
+
case 11:
|
|
2535
|
+
sb.push("11-CRM");
|
|
2536
|
+
break;
|
|
2537
|
+
case 12:
|
|
2538
|
+
sb.push("12-CR3");
|
|
2539
|
+
break;
|
|
2540
|
+
case 13:
|
|
2541
|
+
sb.push("13-CR3+JPEG");
|
|
2542
|
+
break;
|
|
2543
|
+
default:
|
|
2544
|
+
sb.push(valBuff[k]);
|
|
2545
|
+
break;
|
|
2546
|
+
}
|
|
2547
|
+
break;
|
|
2548
|
+
case 10:
|
|
2549
|
+
sb.push("CanonImageSize = ");
|
|
2550
|
+
switch (valBuff[k])
|
|
2551
|
+
{
|
|
2552
|
+
case -1:
|
|
2553
|
+
sb.push("-1-n/a");
|
|
2554
|
+
break;
|
|
2555
|
+
case 0:
|
|
2556
|
+
sb.push("0-Large");
|
|
2557
|
+
break;
|
|
2558
|
+
case 1:
|
|
2559
|
+
sb.push("1-Medium");
|
|
2560
|
+
break;
|
|
2561
|
+
case 2:
|
|
2562
|
+
sb.push("2-Small");
|
|
2563
|
+
break;
|
|
2564
|
+
case 5:
|
|
2565
|
+
sb.push("5-Medium 1");
|
|
2566
|
+
break;
|
|
2567
|
+
case 6:
|
|
2568
|
+
sb.push("6-Medium 2");
|
|
2569
|
+
break;
|
|
2570
|
+
case 7:
|
|
2571
|
+
sb.push("7-Medium 3");
|
|
2572
|
+
break;
|
|
2573
|
+
case 8:
|
|
2574
|
+
sb.push("8-Postcard");
|
|
2575
|
+
break;
|
|
2576
|
+
case 9:
|
|
2577
|
+
sb.push("9-Widescreen");
|
|
2578
|
+
break;
|
|
2579
|
+
case 10:
|
|
2580
|
+
sb.push("10-Medium Widescreen");
|
|
2581
|
+
break;
|
|
2582
|
+
case 14:
|
|
2583
|
+
sb.push("14-Small 1");
|
|
2584
|
+
break;
|
|
2585
|
+
case 15:
|
|
2586
|
+
sb.push("15-Small 2");
|
|
2587
|
+
break;
|
|
2588
|
+
case 16:
|
|
2589
|
+
sb.push("16-Small 3");
|
|
2590
|
+
break;
|
|
2591
|
+
case 128:
|
|
2592
|
+
sb.push("128-640x480 Movie");
|
|
2593
|
+
break;
|
|
2594
|
+
case 129:
|
|
2595
|
+
sb.push("129-Medium Movie");
|
|
2596
|
+
break;
|
|
2597
|
+
case 130:
|
|
2598
|
+
sb.push("130-Small Movie");
|
|
2599
|
+
break;
|
|
2600
|
+
case 137:
|
|
2601
|
+
sb.push("137-1280x720 Movie");
|
|
2602
|
+
break;
|
|
2603
|
+
case 142:
|
|
2604
|
+
sb.push("142-1920x1080 Movie");
|
|
2605
|
+
break;
|
|
2606
|
+
case 143:
|
|
2607
|
+
sb.push("143-4096x2160 Movie");
|
|
2608
|
+
break;
|
|
2609
|
+
default:
|
|
2610
|
+
sb.push(valBuff[k]);
|
|
2611
|
+
break;
|
|
2612
|
+
}
|
|
2613
|
+
break;
|
|
2614
|
+
case 11:
|
|
2615
|
+
sb.push("EasyMode = ");
|
|
2616
|
+
switch (valBuff[k])
|
|
2617
|
+
{
|
|
2618
|
+
case 0:
|
|
2619
|
+
sb.push("0-Full auto");
|
|
2620
|
+
break;
|
|
2621
|
+
case 1:
|
|
2622
|
+
sb.push("1-Manual");
|
|
2623
|
+
break;
|
|
2624
|
+
case 2:
|
|
2625
|
+
sb.push("2-Landscape");
|
|
2626
|
+
break;
|
|
2627
|
+
case 3:
|
|
2628
|
+
sb.push("3-Fast shutter");
|
|
2629
|
+
break;
|
|
2630
|
+
case 4:
|
|
2631
|
+
sb.push("4-Slow shutter");
|
|
2632
|
+
break;
|
|
2633
|
+
case 5:
|
|
2634
|
+
sb.push("5-Night");
|
|
2635
|
+
break;
|
|
2636
|
+
case 6:
|
|
2637
|
+
sb.push("6-Grey Scale");
|
|
2638
|
+
break;
|
|
2639
|
+
case 7:
|
|
2640
|
+
sb.push("7-Sepia");
|
|
2641
|
+
break;
|
|
2642
|
+
case 8:
|
|
2643
|
+
sb.push("8-Portrait");
|
|
2644
|
+
break;
|
|
2645
|
+
case 9:
|
|
2646
|
+
sb.push("9-Sports");
|
|
2647
|
+
break;
|
|
2648
|
+
case 10:
|
|
2649
|
+
sb.push("10-Macro");
|
|
2650
|
+
break;
|
|
2651
|
+
case 11:
|
|
2652
|
+
sb.push("11-Black & White");
|
|
2653
|
+
break;
|
|
2654
|
+
case 12:
|
|
2655
|
+
sb.push("12-Pan focus");
|
|
2656
|
+
break;
|
|
2657
|
+
case 13:
|
|
2658
|
+
sb.push("13-Vivid");
|
|
2659
|
+
break;
|
|
2660
|
+
case 14:
|
|
2661
|
+
sb.push("14-Neutral");
|
|
2662
|
+
break;
|
|
2663
|
+
case 15:
|
|
2664
|
+
sb.push("15-Flash Off");
|
|
2665
|
+
break;
|
|
2666
|
+
case 16:
|
|
2667
|
+
sb.push("16-Long Shutter");
|
|
2668
|
+
break;
|
|
2669
|
+
case 17:
|
|
2670
|
+
sb.push("17-Super Macro");
|
|
2671
|
+
break;
|
|
2672
|
+
case 18:
|
|
2673
|
+
sb.push("18-Foliage");
|
|
2674
|
+
break;
|
|
2675
|
+
case 19:
|
|
2676
|
+
sb.push("19-Indoor");
|
|
2677
|
+
break;
|
|
2678
|
+
case 20:
|
|
2679
|
+
sb.push("20-Fireworks");
|
|
2680
|
+
break;
|
|
2681
|
+
case 21:
|
|
2682
|
+
sb.push("21-Beach");
|
|
2683
|
+
break;
|
|
2684
|
+
case 22:
|
|
2685
|
+
sb.push("22-Underwater");
|
|
2686
|
+
break;
|
|
2687
|
+
case 23:
|
|
2688
|
+
sb.push("23-Snow");
|
|
2689
|
+
break;
|
|
2690
|
+
case 24:
|
|
2691
|
+
sb.push("24-Kids & Pets");
|
|
2692
|
+
break;
|
|
2693
|
+
case 25:
|
|
2694
|
+
sb.push("25-Night Snapshot");
|
|
2695
|
+
break;
|
|
2696
|
+
case 26:
|
|
2697
|
+
sb.push("26-Digital Macro");
|
|
2698
|
+
break;
|
|
2699
|
+
case 27:
|
|
2700
|
+
sb.push("27-My Colors");
|
|
2701
|
+
break;
|
|
2702
|
+
case 28:
|
|
2703
|
+
sb.push("28-Movie Snap");
|
|
2704
|
+
break;
|
|
2705
|
+
case 29:
|
|
2706
|
+
sb.push("29-Super Macro 2");
|
|
2707
|
+
break;
|
|
2708
|
+
case 30:
|
|
2709
|
+
sb.push("30-Color Accent");
|
|
2710
|
+
break;
|
|
2711
|
+
case 31:
|
|
2712
|
+
sb.push("31-Color Swap");
|
|
2713
|
+
break;
|
|
2714
|
+
case 32:
|
|
2715
|
+
sb.push("32-Aquarium");
|
|
2716
|
+
break;
|
|
2717
|
+
case 33:
|
|
2718
|
+
sb.push("33-ISO 3200");
|
|
2719
|
+
break;
|
|
2720
|
+
case 34:
|
|
2721
|
+
sb.push("34-ISO 6400");
|
|
2722
|
+
break;
|
|
2723
|
+
case 35:
|
|
2724
|
+
sb.push("35-Creative Light Effect");
|
|
2725
|
+
break;
|
|
2726
|
+
case 36:
|
|
2727
|
+
sb.push("36-Easy");
|
|
2728
|
+
break;
|
|
2729
|
+
case 37:
|
|
2730
|
+
sb.push("37-Quick Shot");
|
|
2731
|
+
break;
|
|
2732
|
+
case 38:
|
|
2733
|
+
sb.push("38-Creative Auto");
|
|
2734
|
+
break;
|
|
2735
|
+
case 39:
|
|
2736
|
+
sb.push("39-Zoom Blur");
|
|
2737
|
+
break;
|
|
2738
|
+
case 40:
|
|
2739
|
+
sb.push("40-Low Light");
|
|
2740
|
+
break;
|
|
2741
|
+
case 41:
|
|
2742
|
+
sb.push("41-Nostalgic");
|
|
2743
|
+
break;
|
|
2744
|
+
case 42:
|
|
2745
|
+
sb.push("42-Super Vivid");
|
|
2746
|
+
break;
|
|
2747
|
+
case 43:
|
|
2748
|
+
sb.push("43-Poster Effect");
|
|
2749
|
+
break;
|
|
2750
|
+
case 44:
|
|
2751
|
+
sb.push("44-Face Self-Time");
|
|
2752
|
+
break;
|
|
2753
|
+
case 45:
|
|
2754
|
+
sb.push("45-Smile");
|
|
2755
|
+
break;
|
|
2756
|
+
case 46:
|
|
2757
|
+
sb.push("46-Wink Self-Timer");
|
|
2758
|
+
break;
|
|
2759
|
+
case 47:
|
|
2760
|
+
sb.push("47-Fisheye Effect");
|
|
2761
|
+
break;
|
|
2762
|
+
case 48:
|
|
2763
|
+
sb.push("48-Miniature Effect");
|
|
2764
|
+
break;
|
|
2765
|
+
case 49:
|
|
2766
|
+
sb.push("49-High-speed Burst");
|
|
2767
|
+
break;
|
|
2768
|
+
case 50:
|
|
2769
|
+
sb.push("50-Best Image Selection");
|
|
2770
|
+
break;
|
|
2771
|
+
case 51:
|
|
2772
|
+
sb.push("51-High Dynamic Range");
|
|
2773
|
+
break;
|
|
2774
|
+
case 52:
|
|
2775
|
+
sb.push("52-Handheld Night Scene");
|
|
2776
|
+
break;
|
|
2777
|
+
case 53:
|
|
2778
|
+
sb.push("53-Movie Digest");
|
|
2779
|
+
break;
|
|
2780
|
+
case 54:
|
|
2781
|
+
sb.push("54-Live View Control");
|
|
2782
|
+
break;
|
|
2783
|
+
case 55:
|
|
2784
|
+
sb.push("55-Discreet");
|
|
2785
|
+
break;
|
|
2786
|
+
case 56:
|
|
2787
|
+
sb.push("56-Blur Reduction");
|
|
2788
|
+
break;
|
|
2789
|
+
case 57:
|
|
2790
|
+
sb.push("57-Monochrome");
|
|
2791
|
+
break;
|
|
2792
|
+
case 58:
|
|
2793
|
+
sb.push("58-Toy Camera Effect");
|
|
2794
|
+
break;
|
|
2795
|
+
case 59:
|
|
2796
|
+
sb.push("59-Scene Intelligent Auto");
|
|
2797
|
+
break;
|
|
2798
|
+
case 60:
|
|
2799
|
+
sb.push("60-High-speed Burst HQ");
|
|
2800
|
+
break;
|
|
2801
|
+
case 61:
|
|
2802
|
+
sb.push("61-Smooth Skin");
|
|
2803
|
+
break;
|
|
2804
|
+
case 62:
|
|
2805
|
+
sb.push("62-Soft Focus");
|
|
2806
|
+
break;
|
|
2807
|
+
case 257:
|
|
2808
|
+
sb.push("257-Spotlight");
|
|
2809
|
+
break;
|
|
2810
|
+
case 258:
|
|
2811
|
+
sb.push("258-Night 2");
|
|
2812
|
+
break;
|
|
2813
|
+
case 259:
|
|
2814
|
+
sb.push("259-Night+");
|
|
2815
|
+
break;
|
|
2816
|
+
case 260:
|
|
2817
|
+
sb.push("260-Super Night");
|
|
2818
|
+
break;
|
|
2819
|
+
case 261:
|
|
2820
|
+
sb.push("261-Sunset");
|
|
2821
|
+
break;
|
|
2822
|
+
case 263:
|
|
2823
|
+
sb.push("263-Night Scene");
|
|
2824
|
+
break;
|
|
2825
|
+
case 264:
|
|
2826
|
+
sb.push("264-Surface");
|
|
2827
|
+
break;
|
|
2828
|
+
case 265:
|
|
2829
|
+
sb.push("265-Low Light 2");
|
|
2830
|
+
break;
|
|
2831
|
+
default:
|
|
2832
|
+
sb.push(valBuff[k]);
|
|
2833
|
+
break;
|
|
2834
|
+
}
|
|
2835
|
+
break;
|
|
2836
|
+
case 12:
|
|
2837
|
+
sb.push("DigitalZoom = ");
|
|
2838
|
+
switch (valBuff[k])
|
|
2839
|
+
{
|
|
2840
|
+
case 0:
|
|
2841
|
+
sb.push("0-None");
|
|
2842
|
+
break;
|
|
2843
|
+
case 1:
|
|
2844
|
+
sb.push("1-2x");
|
|
2845
|
+
break;
|
|
2846
|
+
case 2:
|
|
2847
|
+
sb.push("2-4x");
|
|
2848
|
+
break;
|
|
2849
|
+
case 3:
|
|
2850
|
+
sb.push("3-Other");
|
|
2851
|
+
break;
|
|
2852
|
+
default:
|
|
2853
|
+
sb.push(valBuff[k]);
|
|
2854
|
+
break;
|
|
2855
|
+
}
|
|
2856
|
+
break;
|
|
2857
|
+
case 13:
|
|
2858
|
+
sb.push("Contrast = ");
|
|
2859
|
+
isInt16 = true;
|
|
2860
|
+
break;
|
|
2861
|
+
case 14:
|
|
2862
|
+
sb.push("Saturation = ");
|
|
2863
|
+
isInt16 = true;
|
|
2864
|
+
break;
|
|
2865
|
+
case 15:
|
|
2866
|
+
sb.push("Sharpness = ");
|
|
2867
|
+
isInt16 = true;
|
|
2868
|
+
break;
|
|
2869
|
+
case 16:
|
|
2870
|
+
sb.push("CameraISO = ");
|
|
2871
|
+
isInt16 = true;
|
|
2872
|
+
break;
|
|
2873
|
+
case 17:
|
|
2874
|
+
sb.push("MeteringMode = ");
|
|
2875
|
+
switch (valBuff[k])
|
|
2876
|
+
{
|
|
2877
|
+
case 0:
|
|
2878
|
+
sb.push("0-Default");
|
|
2879
|
+
break;
|
|
2880
|
+
case 1:
|
|
2881
|
+
sb.push("1-Spot");
|
|
2882
|
+
break;
|
|
2883
|
+
case 2:
|
|
2884
|
+
sb.push("2-Average");
|
|
2885
|
+
break;
|
|
2886
|
+
case 3:
|
|
2887
|
+
sb.push("3-Evaluative");
|
|
2888
|
+
break;
|
|
2889
|
+
case 4:
|
|
2890
|
+
sb.push("4-Partial");
|
|
2891
|
+
break;
|
|
2892
|
+
case 5:
|
|
2893
|
+
sb.push("5-Center-weighted average");
|
|
2894
|
+
break;
|
|
2895
|
+
default:
|
|
2896
|
+
sb.push(valBuff[k]);
|
|
2897
|
+
break;
|
|
2898
|
+
}
|
|
2899
|
+
break;
|
|
2900
|
+
case 18:
|
|
2901
|
+
sb.push("FocusRange = ");
|
|
2902
|
+
switch (valBuff[k])
|
|
2903
|
+
{
|
|
2904
|
+
case 0:
|
|
2905
|
+
sb.push("0-Manual");
|
|
2906
|
+
break;
|
|
2907
|
+
case 1:
|
|
2908
|
+
sb.push("1-Auto");
|
|
2909
|
+
break;
|
|
2910
|
+
case 2:
|
|
2911
|
+
sb.push("2-Not Known");
|
|
2912
|
+
break;
|
|
2913
|
+
case 3:
|
|
2914
|
+
sb.push("3-Macro");
|
|
2915
|
+
break;
|
|
2916
|
+
case 4:
|
|
2917
|
+
sb.push("4-Very Close");
|
|
2918
|
+
break;
|
|
2919
|
+
case 5:
|
|
2920
|
+
sb.push("5-Close");
|
|
2921
|
+
break;
|
|
2922
|
+
case 6:
|
|
2923
|
+
sb.push("6-Middle Range");
|
|
2924
|
+
break;
|
|
2925
|
+
case 7:
|
|
2926
|
+
sb.push("7-Far Range");
|
|
2927
|
+
break;
|
|
2928
|
+
case 8:
|
|
2929
|
+
sb.push("8-Pan Focus");
|
|
2930
|
+
break;
|
|
2931
|
+
case 9:
|
|
2932
|
+
sb.push("9-Super Macro");
|
|
2933
|
+
break;
|
|
2934
|
+
case 10:
|
|
2935
|
+
sb.push("10-Infinity");
|
|
2936
|
+
break;
|
|
2937
|
+
default:
|
|
2938
|
+
sb.push(valBuff[k]);
|
|
2939
|
+
break;
|
|
2940
|
+
}
|
|
2941
|
+
break;
|
|
2942
|
+
case 19:
|
|
2943
|
+
sb.push("AFPoint = ");
|
|
2944
|
+
switch (valBuff[k])
|
|
2945
|
+
{
|
|
2946
|
+
case 0x2005:
|
|
2947
|
+
sb.push("0x2005-Manual AF point selection ");
|
|
2948
|
+
break;
|
|
2949
|
+
case 0x3000:
|
|
2950
|
+
sb.push("0x3000-None (MF)");
|
|
2951
|
+
break;
|
|
2952
|
+
case 0x3001:
|
|
2953
|
+
sb.push("0x3001-Auto AF point selection");
|
|
2954
|
+
break;
|
|
2955
|
+
case 0x3002:
|
|
2956
|
+
sb.push("0x3002-Right");
|
|
2957
|
+
break;
|
|
2958
|
+
case 0x3003:
|
|
2959
|
+
sb.push("0x3003-Center");
|
|
2960
|
+
break;
|
|
2961
|
+
case 0x3004:
|
|
2962
|
+
sb.push("0x3004-Left");
|
|
2963
|
+
break;
|
|
2964
|
+
case 0x4001:
|
|
2965
|
+
sb.push("0x4001-Auto AF point selection");
|
|
2966
|
+
break;
|
|
2967
|
+
case 0x4006:
|
|
2968
|
+
sb.push("0x4006-Face Detect");
|
|
2969
|
+
break;
|
|
2970
|
+
default:
|
|
2971
|
+
sb.push(valBuff[k]);
|
|
2972
|
+
break;
|
|
2973
|
+
}
|
|
2974
|
+
break;
|
|
2975
|
+
case 20:
|
|
2976
|
+
sb.push("CanonExposureMode = ");
|
|
2977
|
+
switch (valBuff[k])
|
|
2978
|
+
{
|
|
2979
|
+
case 0:
|
|
2980
|
+
sb.push("0-Easy");
|
|
2981
|
+
break;
|
|
2982
|
+
case 1:
|
|
2983
|
+
sb.push("1-Program AE");
|
|
2984
|
+
break;
|
|
2985
|
+
case 2:
|
|
2986
|
+
sb.push("2-Shutter speed priority AE");
|
|
2987
|
+
break;
|
|
2988
|
+
case 3:
|
|
2989
|
+
sb.push("3-Aperture-priority AE");
|
|
2990
|
+
break;
|
|
2991
|
+
case 4:
|
|
2992
|
+
sb.push("4-Manual");
|
|
2993
|
+
break;
|
|
2994
|
+
case 5:
|
|
2995
|
+
sb.push("5-Depth-of-field AE");
|
|
2996
|
+
break;
|
|
2997
|
+
case 6:
|
|
2998
|
+
sb.push("6-M-Dep");
|
|
2999
|
+
break;
|
|
3000
|
+
case 7:
|
|
3001
|
+
sb.push("7-Bulb");
|
|
3002
|
+
break;
|
|
3003
|
+
default:
|
|
3004
|
+
sb.push(valBuff[k]);
|
|
3005
|
+
break;
|
|
3006
|
+
}
|
|
3007
|
+
break;
|
|
3008
|
+
case 22:
|
|
3009
|
+
sb.push("LensType = ");
|
|
3010
|
+
sb.push(this.toStringCanonLensType(valBuff[k]));
|
|
3011
|
+
break;
|
|
3012
|
+
case 23:
|
|
3013
|
+
sb.push("MaxFocalLength = ");
|
|
3014
|
+
isUInt16 = true;
|
|
3015
|
+
break;
|
|
3016
|
+
case 24:
|
|
3017
|
+
sb.push("MinFocalLength = ");
|
|
3018
|
+
isUInt16 = true;
|
|
3019
|
+
break;
|
|
3020
|
+
case 25:
|
|
3021
|
+
sb.push("FocalUnits = ");
|
|
3022
|
+
isInt16 = true;
|
|
3023
|
+
break;
|
|
3024
|
+
case 26:
|
|
3025
|
+
sb.push("MaxAperture = ");
|
|
3026
|
+
isInt16 = true;
|
|
3027
|
+
break;
|
|
3028
|
+
case 27:
|
|
3029
|
+
sb.push("MinAperture = ");
|
|
3030
|
+
isInt16 = true;
|
|
3031
|
+
break;
|
|
3032
|
+
case 28:
|
|
3033
|
+
sb.push("FlashActivity = ");
|
|
3034
|
+
isInt16 = true;
|
|
3035
|
+
break;
|
|
3036
|
+
case 29:
|
|
3037
|
+
sb.push("FlashBits = 0x");
|
|
3038
|
+
sb.push(text.toHex16(valBuff[k]));
|
|
3039
|
+
break;
|
|
3040
|
+
case 32:
|
|
3041
|
+
sb.push("FocusContinuous = ");
|
|
3042
|
+
switch (valBuff[k])
|
|
3043
|
+
{
|
|
3044
|
+
case 0:
|
|
3045
|
+
sb.push("0-Single");
|
|
3046
|
+
break;
|
|
3047
|
+
case 1:
|
|
3048
|
+
sb.push("1-Continuous");
|
|
3049
|
+
break;
|
|
3050
|
+
case 8:
|
|
3051
|
+
sb.push("8-Manual");
|
|
3052
|
+
break;
|
|
3053
|
+
default:
|
|
3054
|
+
sb.push(valBuff[k]);
|
|
3055
|
+
break;
|
|
3056
|
+
}
|
|
3057
|
+
break;
|
|
3058
|
+
case 33:
|
|
3059
|
+
sb.push("AESetting = ");
|
|
3060
|
+
switch (valBuff[k])
|
|
3061
|
+
{
|
|
3062
|
+
case 0:
|
|
3063
|
+
sb.push("0-Normal AE");
|
|
3064
|
+
break;
|
|
3065
|
+
case 1:
|
|
3066
|
+
sb.push("1-Exposure Compensation");
|
|
3067
|
+
break;
|
|
3068
|
+
case 2:
|
|
3069
|
+
sb.push("2-AE Lock");
|
|
3070
|
+
break;
|
|
3071
|
+
case 3:
|
|
3072
|
+
sb.push("3-AE Lock + Exposure Comp.");
|
|
3073
|
+
break;
|
|
3074
|
+
case 4:
|
|
3075
|
+
sb.push("4-No AE");
|
|
3076
|
+
break;
|
|
3077
|
+
default:
|
|
3078
|
+
sb.push(valBuff[k]);
|
|
3079
|
+
break;
|
|
3080
|
+
}
|
|
3081
|
+
break;
|
|
3082
|
+
case 34:
|
|
3083
|
+
sb.push("ImageStabilization = ");
|
|
3084
|
+
switch (valBuff[k])
|
|
3085
|
+
{
|
|
3086
|
+
case 0:
|
|
3087
|
+
sb.push("0-Off");
|
|
3088
|
+
break;
|
|
3089
|
+
case 1:
|
|
3090
|
+
sb.push("1-On");
|
|
3091
|
+
break;
|
|
3092
|
+
case 2:
|
|
3093
|
+
sb.push("2-Shoot Only");
|
|
3094
|
+
break;
|
|
3095
|
+
case 3:
|
|
3096
|
+
sb.push("3-Panning");
|
|
3097
|
+
break;
|
|
3098
|
+
case 4:
|
|
3099
|
+
sb.push("4-Dynamic");
|
|
3100
|
+
break;
|
|
3101
|
+
case 256:
|
|
3102
|
+
sb.push("256-Off");
|
|
3103
|
+
break;
|
|
3104
|
+
case 257:
|
|
3105
|
+
sb.push("257-On");
|
|
3106
|
+
break;
|
|
3107
|
+
case 258:
|
|
3108
|
+
sb.push("258-Shoot Only");
|
|
3109
|
+
break;
|
|
3110
|
+
case 259:
|
|
3111
|
+
sb.push("259-Panning");
|
|
3112
|
+
break;
|
|
3113
|
+
case 260:
|
|
3114
|
+
sb.push("260-Dynamic");
|
|
3115
|
+
break;
|
|
3116
|
+
default:
|
|
3117
|
+
sb.push(valBuff[k]);
|
|
3118
|
+
break;
|
|
3119
|
+
}
|
|
3120
|
+
break;
|
|
3121
|
+
case 35:
|
|
3122
|
+
sb.push("DisplayAperture = ");
|
|
3123
|
+
isInt16 = true;
|
|
3124
|
+
break;
|
|
3125
|
+
case 36:
|
|
3126
|
+
sb.push("ZoomSourceWidth = ");
|
|
3127
|
+
isInt16 = true;
|
|
3128
|
+
break;
|
|
3129
|
+
case 37:
|
|
3130
|
+
sb.push("ZoomTargetWidth = ");
|
|
3131
|
+
isInt16 = true;
|
|
3132
|
+
break;
|
|
3133
|
+
case 39:
|
|
3134
|
+
sb.push("AESetting = ");
|
|
3135
|
+
switch (valBuff[k])
|
|
3136
|
+
{
|
|
3137
|
+
case 0:
|
|
3138
|
+
sb.push("0-Center");
|
|
3139
|
+
break;
|
|
3140
|
+
case 1:
|
|
3141
|
+
sb.push("1-AF Point");
|
|
3142
|
+
break;
|
|
3143
|
+
default:
|
|
3144
|
+
sb.push(valBuff[k]);
|
|
3145
|
+
break;
|
|
3146
|
+
}
|
|
3147
|
+
break;
|
|
3148
|
+
case 40:
|
|
3149
|
+
sb.push("PhotoEffect = ");
|
|
3150
|
+
switch (valBuff[k])
|
|
3151
|
+
{
|
|
3152
|
+
case 0:
|
|
3153
|
+
sb.push("0-Off");
|
|
3154
|
+
break;
|
|
3155
|
+
case 1:
|
|
3156
|
+
sb.push("1-Vivid");
|
|
3157
|
+
break;
|
|
3158
|
+
case 2:
|
|
3159
|
+
sb.push("2-Neutral");
|
|
3160
|
+
break;
|
|
3161
|
+
case 3:
|
|
3162
|
+
sb.push("3-Smooth");
|
|
3163
|
+
break;
|
|
3164
|
+
case 4:
|
|
3165
|
+
sb.push("4-Sepia");
|
|
3166
|
+
break;
|
|
3167
|
+
case 5:
|
|
3168
|
+
sb.push("5-B&W");
|
|
3169
|
+
break;
|
|
3170
|
+
case 6:
|
|
3171
|
+
sb.push("6-Custom");
|
|
3172
|
+
break;
|
|
3173
|
+
case 100:
|
|
3174
|
+
sb.push("100-My Color Data");
|
|
3175
|
+
break;
|
|
3176
|
+
default:
|
|
3177
|
+
sb.push(valBuff[k]);
|
|
3178
|
+
break;
|
|
3179
|
+
}
|
|
3180
|
+
break;
|
|
3181
|
+
case 41:
|
|
3182
|
+
sb.push("ManualFlashOutput = ");
|
|
3183
|
+
switch (valBuff[k])
|
|
3184
|
+
{
|
|
3185
|
+
case 0:
|
|
3186
|
+
sb.push("0-n/a");
|
|
3187
|
+
break;
|
|
3188
|
+
case 0x500:
|
|
3189
|
+
sb.push("0x500-Full");
|
|
3190
|
+
break;
|
|
3191
|
+
case 0x502:
|
|
3192
|
+
sb.push("0x500-Medium");
|
|
3193
|
+
break;
|
|
3194
|
+
case 0x504:
|
|
3195
|
+
sb.push("0x500-Low");
|
|
3196
|
+
break;
|
|
3197
|
+
case 0x7fff:
|
|
3198
|
+
sb.push("0x7fff-n/a");
|
|
3199
|
+
break;
|
|
3200
|
+
default:
|
|
3201
|
+
sb.push("0x");
|
|
3202
|
+
sb.push(text.toHex16(valBuff[k]));
|
|
3203
|
+
break;
|
|
3204
|
+
}
|
|
3205
|
+
break;
|
|
3206
|
+
case 42:
|
|
3207
|
+
sb.push("ColorTone = ");
|
|
3208
|
+
isInt16 = true;
|
|
3209
|
+
break;
|
|
3210
|
+
case 46:
|
|
3211
|
+
sb.push("SRAWQuality = ");
|
|
3212
|
+
switch (valBuff[k])
|
|
3213
|
+
{
|
|
3214
|
+
case 0:
|
|
3215
|
+
sb.push("0-n/a");
|
|
3216
|
+
break;
|
|
3217
|
+
case 1:
|
|
3218
|
+
sb.push("1-sRAW1(mRAW)");
|
|
3219
|
+
break;
|
|
3220
|
+
case 2:
|
|
3221
|
+
sb.push("2-sRAW2(sRAW)");
|
|
3222
|
+
break;
|
|
3223
|
+
default:
|
|
3224
|
+
sb.push("0x");
|
|
3225
|
+
sb.push(text.toHex16(valBuff[k]));
|
|
3226
|
+
break;
|
|
3227
|
+
}
|
|
3228
|
+
break;
|
|
3229
|
+
default:
|
|
3230
|
+
sb.push("Unknown(");
|
|
3231
|
+
sb.push(k);
|
|
3232
|
+
sb.push(") = ");
|
|
3233
|
+
isInt16 = true;
|
|
3234
|
+
break;
|
|
3235
|
+
}
|
|
3236
|
+
if (isInt16)
|
|
3237
|
+
{
|
|
3238
|
+
sb.push(valBuff[k]);
|
|
3239
|
+
}
|
|
3240
|
+
else if (isUInt16)
|
|
3241
|
+
{
|
|
3242
|
+
sb.push(valBuff[k]);
|
|
3243
|
+
}
|
|
3244
|
+
k++;
|
|
3245
|
+
}
|
|
3246
|
+
return sb.join("");
|
|
3247
|
+
}
|
|
3248
|
+
|
|
3249
|
+
toStringCanonFocalLength(linePrefix, valBuff)
|
|
3250
|
+
{
|
|
3251
|
+
let sb = [];
|
|
3252
|
+
let isInt16;
|
|
3253
|
+
let isUInt16;
|
|
3254
|
+
let k;
|
|
3255
|
+
k = 0;
|
|
3256
|
+
while (k < valBuff.length)
|
|
3257
|
+
{
|
|
3258
|
+
sb.push("\r\n");
|
|
3259
|
+
if (linePrefix) sb.push(linePrefix);
|
|
3260
|
+
sb.push(" ");
|
|
3261
|
+
isInt16 = false;
|
|
3262
|
+
isUInt16 = false;
|
|
3263
|
+
switch (k)
|
|
3264
|
+
{
|
|
3265
|
+
case 0:
|
|
3266
|
+
sb.push("FocalType = ");
|
|
3267
|
+
switch (valBuff[k])
|
|
3268
|
+
{
|
|
3269
|
+
case 1:
|
|
3270
|
+
sb.push("1-Fixed");
|
|
3271
|
+
break;
|
|
3272
|
+
case 2:
|
|
3273
|
+
sb.push("2-Zoom");
|
|
3274
|
+
break;
|
|
3275
|
+
default:
|
|
3276
|
+
sb.push(valBuff[k]);
|
|
3277
|
+
break;
|
|
3278
|
+
}
|
|
3279
|
+
break;
|
|
3280
|
+
case 1:
|
|
3281
|
+
sb.push("FocalLength = ");
|
|
3282
|
+
isUInt16 = true;
|
|
3283
|
+
break;
|
|
3284
|
+
case 2:
|
|
3285
|
+
sb.push("FocalPlaneXSize = ");
|
|
3286
|
+
isUInt16 = true;
|
|
3287
|
+
break;
|
|
3288
|
+
case 3:
|
|
3289
|
+
sb.push("FocalPlaneYSize = ");
|
|
3290
|
+
isUInt16 = true;
|
|
3291
|
+
break;
|
|
3292
|
+
default:
|
|
3293
|
+
sb.push("Unknown(");
|
|
3294
|
+
sb.push(k);
|
|
3295
|
+
sb.push(") = ");
|
|
3296
|
+
isInt16 = true;
|
|
3297
|
+
break;
|
|
3298
|
+
}
|
|
3299
|
+
if (isInt16)
|
|
3300
|
+
{
|
|
3301
|
+
sb.push(valBuff[k]);
|
|
3302
|
+
}
|
|
3303
|
+
else if (isUInt16)
|
|
3304
|
+
{
|
|
3305
|
+
sb.push(valBuff[k]);
|
|
3306
|
+
}
|
|
3307
|
+
k++;
|
|
3308
|
+
}
|
|
3309
|
+
return sb.join("");
|
|
3310
|
+
}
|
|
3311
|
+
|
|
3312
|
+
toStringCanonShotInfo(linePrefix, valBuff)
|
|
3313
|
+
{
|
|
3314
|
+
let sb = [];
|
|
3315
|
+
let isInt16;
|
|
3316
|
+
let isUInt16;
|
|
3317
|
+
let k;
|
|
3318
|
+
k = 0;
|
|
3319
|
+
while (k < valBuff.length)
|
|
3320
|
+
{
|
|
3321
|
+
sb.push("\r\n");
|
|
3322
|
+
if (linePrefix) sb.push(linePrefix);
|
|
3323
|
+
sb.push(" ");
|
|
3324
|
+
isInt16 = false;
|
|
3325
|
+
isUInt16 = false;
|
|
3326
|
+
switch (k)
|
|
3327
|
+
{
|
|
3328
|
+
case 1:
|
|
3329
|
+
sb.push("AutoISO = ");
|
|
3330
|
+
isInt16 = true;
|
|
3331
|
+
break;
|
|
3332
|
+
case 2:
|
|
3333
|
+
sb.push("BaseISO = ");
|
|
3334
|
+
isInt16 = true;
|
|
3335
|
+
break;
|
|
3336
|
+
case 3:
|
|
3337
|
+
sb.push("MeasuredEV = ");
|
|
3338
|
+
isInt16 = true;
|
|
3339
|
+
break;
|
|
3340
|
+
case 4:
|
|
3341
|
+
sb.push("TargetAperture = ");
|
|
3342
|
+
isInt16 = true;
|
|
3343
|
+
break;
|
|
3344
|
+
case 5:
|
|
3345
|
+
sb.push("TargetExposureTime = ");
|
|
3346
|
+
isInt16 = true;
|
|
3347
|
+
break;
|
|
3348
|
+
case 6:
|
|
3349
|
+
sb.push("ExposureCompensation = ");
|
|
3350
|
+
isInt16 = true;
|
|
3351
|
+
break;
|
|
3352
|
+
case 7:
|
|
3353
|
+
sb.push("WhiteBalance = ");
|
|
3354
|
+
isInt16 = true;
|
|
3355
|
+
break;
|
|
3356
|
+
case 8:
|
|
3357
|
+
sb.push("SlowShutter = ");
|
|
3358
|
+
switch (valBuff[k])
|
|
3359
|
+
{
|
|
3360
|
+
case -1:
|
|
3361
|
+
sb.push("-1-n/a");
|
|
3362
|
+
break;
|
|
3363
|
+
case 0:
|
|
3364
|
+
sb.push("0-Off");
|
|
3365
|
+
break;
|
|
3366
|
+
case 1:
|
|
3367
|
+
sb.push("1-Night Scene");
|
|
3368
|
+
break;
|
|
3369
|
+
case 2:
|
|
3370
|
+
sb.push("2-On");
|
|
3371
|
+
break;
|
|
3372
|
+
case 3:
|
|
3373
|
+
sb.push("3-None");
|
|
3374
|
+
break;
|
|
3375
|
+
default:
|
|
3376
|
+
sb.push(valBuff[k]);
|
|
3377
|
+
break;
|
|
3378
|
+
}
|
|
3379
|
+
break;
|
|
3380
|
+
case 9:
|
|
3381
|
+
sb.push("SequenceNumber = ");
|
|
3382
|
+
isInt16 = true;
|
|
3383
|
+
break;
|
|
3384
|
+
case 10:
|
|
3385
|
+
sb.push("OpticalZoomCode = ");
|
|
3386
|
+
isInt16 = true;
|
|
3387
|
+
break;
|
|
3388
|
+
case 12:
|
|
3389
|
+
sb.push("CameraTemperature = ");
|
|
3390
|
+
isInt16 = true;
|
|
3391
|
+
break;
|
|
3392
|
+
case 13:
|
|
3393
|
+
sb.push("FlashGuideNumber = ");
|
|
3394
|
+
isInt16 = true;
|
|
3395
|
+
break;
|
|
3396
|
+
case 14:
|
|
3397
|
+
sb.push("AFPointsInFocus = ");
|
|
3398
|
+
switch (valBuff[k])
|
|
3399
|
+
{
|
|
3400
|
+
case 0x3000:
|
|
3401
|
+
sb.push("0x3000-None (MF)");
|
|
3402
|
+
break;
|
|
3403
|
+
case 0x3001:
|
|
3404
|
+
sb.push("0x3001-Right");
|
|
3405
|
+
break;
|
|
3406
|
+
case 0x3002:
|
|
3407
|
+
sb.push("0x3002-Center");
|
|
3408
|
+
break;
|
|
3409
|
+
case 0x3003:
|
|
3410
|
+
sb.push("0x3003-Center+Right");
|
|
3411
|
+
break;
|
|
3412
|
+
case 0x3004:
|
|
3413
|
+
sb.push("0x3004-Left");
|
|
3414
|
+
break;
|
|
3415
|
+
case 0x3005:
|
|
3416
|
+
sb.push("0x3005-Left+Right");
|
|
3417
|
+
break;
|
|
3418
|
+
case 0x3006:
|
|
3419
|
+
sb.push("0x3006-Left+Center");
|
|
3420
|
+
break;
|
|
3421
|
+
case 0x3007:
|
|
3422
|
+
sb.push("0x3007-All");
|
|
3423
|
+
break;
|
|
3424
|
+
default:
|
|
3425
|
+
sb.push("0x");
|
|
3426
|
+
sb.push(text.toHex16(valBuff[k]));
|
|
3427
|
+
break;
|
|
3428
|
+
}
|
|
3429
|
+
break;
|
|
3430
|
+
case 15:
|
|
3431
|
+
sb.push("FlashExposureComp = ");
|
|
3432
|
+
isInt16 = true;
|
|
3433
|
+
break;
|
|
3434
|
+
case 16:
|
|
3435
|
+
sb.push("AutoExposureBracketing = ");
|
|
3436
|
+
switch (valBuff[k])
|
|
3437
|
+
{
|
|
3438
|
+
case -1:
|
|
3439
|
+
sb.push("-1-On");
|
|
3440
|
+
break;
|
|
3441
|
+
case 0:
|
|
3442
|
+
sb.push("0-Off");
|
|
3443
|
+
break;
|
|
3444
|
+
case 1:
|
|
3445
|
+
sb.push("1-On (shot 1)");
|
|
3446
|
+
break;
|
|
3447
|
+
case 2:
|
|
3448
|
+
sb.push("2-On (shot 2)");
|
|
3449
|
+
break;
|
|
3450
|
+
case 3:
|
|
3451
|
+
sb.push("3-On (shot 3)");
|
|
3452
|
+
break;
|
|
3453
|
+
default:
|
|
3454
|
+
sb.push(valBuff[k]);
|
|
3455
|
+
break;
|
|
3456
|
+
}
|
|
3457
|
+
break;
|
|
3458
|
+
case 17:
|
|
3459
|
+
sb.push("AEBBracketValue = ");
|
|
3460
|
+
isInt16 = true;
|
|
3461
|
+
break;
|
|
3462
|
+
case 18:
|
|
3463
|
+
sb.push("ControlMode = ");
|
|
3464
|
+
switch (valBuff[k])
|
|
3465
|
+
{
|
|
3466
|
+
case 0:
|
|
3467
|
+
sb.push("0-n/a");
|
|
3468
|
+
break;
|
|
3469
|
+
case 1:
|
|
3470
|
+
sb.push("1-Camera Local Control");
|
|
3471
|
+
break;
|
|
3472
|
+
case 3:
|
|
3473
|
+
sb.push("3-Computer Remote Control");
|
|
3474
|
+
break;
|
|
3475
|
+
default:
|
|
3476
|
+
sb.push(valBuff[k]);
|
|
3477
|
+
break;
|
|
3478
|
+
}
|
|
3479
|
+
break;
|
|
3480
|
+
case 19:
|
|
3481
|
+
sb.push("FocusDistanceUpper = ");
|
|
3482
|
+
isUInt16 = true;
|
|
3483
|
+
break;
|
|
3484
|
+
case 20:
|
|
3485
|
+
sb.push("FocusDistanceLower = ");
|
|
3486
|
+
isUInt16 = true;
|
|
3487
|
+
break;
|
|
3488
|
+
case 21:
|
|
3489
|
+
sb.push("FNumber = ");
|
|
3490
|
+
isInt16 = true;
|
|
3491
|
+
break;
|
|
3492
|
+
case 22:
|
|
3493
|
+
sb.push("ExposureTime = ");
|
|
3494
|
+
isInt16 = true;
|
|
3495
|
+
break;
|
|
3496
|
+
case 23:
|
|
3497
|
+
sb.push("MeasuredEV2 = ");
|
|
3498
|
+
isInt16 = true;
|
|
3499
|
+
break;
|
|
3500
|
+
case 24:
|
|
3501
|
+
sb.push("BulbDuration = ");
|
|
3502
|
+
isInt16 = true;
|
|
3503
|
+
break;
|
|
3504
|
+
case 26:
|
|
3505
|
+
sb.push("CameraType = ");
|
|
3506
|
+
switch (valBuff[k])
|
|
3507
|
+
{
|
|
3508
|
+
case 0:
|
|
3509
|
+
sb.push("0-n/a");
|
|
3510
|
+
break;
|
|
3511
|
+
case 248:
|
|
3512
|
+
sb.push("248-EOS High-end");
|
|
3513
|
+
break;
|
|
3514
|
+
case 250:
|
|
3515
|
+
sb.push("250-Compact");
|
|
3516
|
+
break;
|
|
3517
|
+
case 252:
|
|
3518
|
+
sb.push("252-EOS Mid-range");
|
|
3519
|
+
break;
|
|
3520
|
+
case 255:
|
|
3521
|
+
sb.push("255-DV Camera");
|
|
3522
|
+
break;
|
|
3523
|
+
default:
|
|
3524
|
+
sb.push(valBuff[k]);
|
|
3525
|
+
break;
|
|
3526
|
+
}
|
|
3527
|
+
break;
|
|
3528
|
+
case 27:
|
|
3529
|
+
sb.push("AutoRotate = ");
|
|
3530
|
+
switch (valBuff[k])
|
|
3531
|
+
{
|
|
3532
|
+
case -1:
|
|
3533
|
+
sb.push("-1-n/a");
|
|
3534
|
+
break;
|
|
3535
|
+
case 0:
|
|
3536
|
+
sb.push("0-None");
|
|
3537
|
+
break;
|
|
3538
|
+
case 1:
|
|
3539
|
+
sb.push("1-Rotate 90 CW");
|
|
3540
|
+
break;
|
|
3541
|
+
case 2:
|
|
3542
|
+
sb.push("1-Rotate 180");
|
|
3543
|
+
break;
|
|
3544
|
+
case 3:
|
|
3545
|
+
sb.push("3-Rotate 270 CW");
|
|
3546
|
+
break;
|
|
3547
|
+
default:
|
|
3548
|
+
sb.push(valBuff[k]);
|
|
3549
|
+
break;
|
|
3550
|
+
}
|
|
3551
|
+
break;
|
|
3552
|
+
case 28:
|
|
3553
|
+
sb.push("NDFilter = ");
|
|
3554
|
+
switch (valBuff[k])
|
|
3555
|
+
{
|
|
3556
|
+
case -1:
|
|
3557
|
+
sb.push("-1-n/a");
|
|
3558
|
+
break;
|
|
3559
|
+
case 0:
|
|
3560
|
+
sb.push("0-Off");
|
|
3561
|
+
break;
|
|
3562
|
+
case 1:
|
|
3563
|
+
sb.push("1-On");
|
|
3564
|
+
break;
|
|
3565
|
+
default:
|
|
3566
|
+
sb.push(valBuff[k]);
|
|
3567
|
+
break;
|
|
3568
|
+
}
|
|
3569
|
+
break;
|
|
3570
|
+
case 29:
|
|
3571
|
+
sb.push("SelfTimer2 = ");
|
|
3572
|
+
isInt16 = true;
|
|
3573
|
+
break;
|
|
3574
|
+
case 33:
|
|
3575
|
+
sb.push("FlashOutput = ");
|
|
3576
|
+
isInt16 = true;
|
|
3577
|
+
break;
|
|
3578
|
+
default:
|
|
3579
|
+
sb.push("Unknown(");
|
|
3580
|
+
sb.push(k);
|
|
3581
|
+
sb.push(") = ");
|
|
3582
|
+
isInt16 = true;
|
|
3583
|
+
break;
|
|
3584
|
+
}
|
|
3585
|
+
if (isInt16)
|
|
3586
|
+
{
|
|
3587
|
+
sb.push(valBuff[k]);
|
|
3588
|
+
}
|
|
3589
|
+
else if (isUInt16)
|
|
3590
|
+
{
|
|
3591
|
+
sb.push(valBuff[k]);
|
|
3592
|
+
}
|
|
3593
|
+
k++;
|
|
3594
|
+
}
|
|
3595
|
+
return sb.join("");
|
|
3596
|
+
}
|
|
3597
|
+
|
|
3598
|
+
toStringCanonLensType(lensType)
|
|
3599
|
+
{
|
|
3600
|
+
return "0x" + text.toHex16(lensType);
|
|
3601
|
+
}
|
|
3602
|
+
|
|
1792
3603
|
parseMakerNote(buff)
|
|
1793
3604
|
{
|
|
1794
3605
|
let reader = new data.ByteReader(buff);
|
|
@@ -1844,93 +3655,98 @@ export class EXIFData
|
|
|
1844
3655
|
{
|
|
1845
3656
|
if (maker == "Canon")
|
|
1846
3657
|
{
|
|
1847
|
-
return EXIFData.parseIFD(reader, 0, true, null,
|
|
3658
|
+
return EXIFData.parseIFD(reader, 0, true, null, null, EXIFMaker.Canon);
|
|
1848
3659
|
}
|
|
1849
3660
|
else if (maker == "CASIO")
|
|
1850
3661
|
{
|
|
1851
|
-
return EXIFData.parseIFD(reader, 0, false, null,
|
|
3662
|
+
return EXIFData.parseIFD(reader, 0, false, null, null, EXIFMaker.Casio1);
|
|
1852
3663
|
}
|
|
1853
3664
|
else if (maker == "FLIR Systems AB")
|
|
1854
3665
|
{
|
|
1855
|
-
return EXIFData.parseIFD(reader, 0, true, null,
|
|
3666
|
+
return EXIFData.parseIFD(reader, 0, true, null, null, EXIFMaker.FLIR);
|
|
1856
3667
|
}
|
|
1857
3668
|
}
|
|
1858
3669
|
}
|
|
1859
3670
|
return null;
|
|
1860
3671
|
}
|
|
1861
3672
|
|
|
1862
|
-
|
|
3673
|
+
/**
|
|
3674
|
+
* @param {string} exifMaker
|
|
3675
|
+
* @param {string | number} id
|
|
3676
|
+
* @param {number | undefined} [parentId]
|
|
3677
|
+
*/
|
|
3678
|
+
static getEXIFName(exifMaker, id, parentId)
|
|
1863
3679
|
{
|
|
1864
3680
|
let name = null;
|
|
1865
|
-
if (
|
|
3681
|
+
if (parentId === undefined)
|
|
1866
3682
|
{
|
|
1867
3683
|
switch (exifMaker)
|
|
1868
3684
|
{
|
|
1869
3685
|
case EXIFMaker.Panasonic:
|
|
1870
|
-
name = EXIFNamesPanasonic[
|
|
3686
|
+
name = EXIFNamesPanasonic[id];
|
|
1871
3687
|
break;
|
|
1872
3688
|
case EXIFMaker.Canon:
|
|
1873
|
-
name = EXIFNamesCanon[
|
|
3689
|
+
name = EXIFNamesCanon[id];
|
|
1874
3690
|
break;
|
|
1875
3691
|
case EXIFMaker.Olympus:
|
|
1876
|
-
name = EXIFNamesOlympus[
|
|
3692
|
+
name = EXIFNamesOlympus[id];
|
|
1877
3693
|
break;
|
|
1878
3694
|
case EXIFMaker.Casio1:
|
|
1879
|
-
name = EXIFNamesCasio1[
|
|
3695
|
+
name = EXIFNamesCasio1[id];
|
|
1880
3696
|
break;
|
|
1881
3697
|
case EXIFMaker.Casio2:
|
|
1882
|
-
name = EXIFNamesCasio2[
|
|
3698
|
+
name = EXIFNamesCasio2[id];
|
|
1883
3699
|
break;
|
|
1884
3700
|
case EXIFMaker.FLIR:
|
|
1885
|
-
name = EXIFNamesFLIR[
|
|
3701
|
+
name = EXIFNamesFLIR[id];
|
|
1886
3702
|
break;
|
|
1887
3703
|
case EXIFMaker.Nikon3:
|
|
1888
|
-
name = EXIFNamesNikon3[
|
|
3704
|
+
name = EXIFNamesNikon3[id];
|
|
1889
3705
|
break;
|
|
1890
3706
|
case EXIFMaker.Sanyo:
|
|
1891
|
-
name = EXIFNamesSanyo1[
|
|
3707
|
+
name = EXIFNamesSanyo1[id];
|
|
1892
3708
|
break;
|
|
1893
3709
|
case EXIFMaker.Apple:
|
|
1894
|
-
name = EXIFNamesApple[
|
|
3710
|
+
name = EXIFNamesApple[id];
|
|
1895
3711
|
break;
|
|
1896
3712
|
case EXIFMaker.Standard:
|
|
1897
3713
|
default:
|
|
1898
|
-
name = EXIFNamesStandard[
|
|
3714
|
+
name = EXIFNamesStandard[id];
|
|
1899
3715
|
break;
|
|
1900
3716
|
}
|
|
1901
3717
|
}
|
|
1902
|
-
else if (
|
|
3718
|
+
else if (parentId == 34665)
|
|
1903
3719
|
{
|
|
1904
|
-
name = EXIFNamesInfo[
|
|
3720
|
+
name = EXIFNamesInfo[id];
|
|
1905
3721
|
}
|
|
1906
|
-
else if (
|
|
3722
|
+
else if (parentId == 34853)
|
|
1907
3723
|
{
|
|
1908
|
-
name = EXIFNamesGPS[
|
|
3724
|
+
name = EXIFNamesGPS[id];
|
|
1909
3725
|
}
|
|
1910
3726
|
else if (exifMaker == EXIFMaker.Olympus)
|
|
1911
3727
|
{
|
|
1912
|
-
if (
|
|
3728
|
+
if (parentId == 0x2010)
|
|
1913
3729
|
{
|
|
1914
|
-
name = EXIFNamesOlympus2010[
|
|
3730
|
+
name = EXIFNamesOlympus2010[id];
|
|
1915
3731
|
}
|
|
1916
|
-
else if (
|
|
3732
|
+
else if (parentId == 0x2020)
|
|
1917
3733
|
{
|
|
1918
|
-
name = EXIFNamesOlympus2020[
|
|
3734
|
+
name = EXIFNamesOlympus2020[id];
|
|
1919
3735
|
}
|
|
1920
|
-
else if (
|
|
3736
|
+
else if (parentId == 0x2030)
|
|
1921
3737
|
{
|
|
1922
|
-
name = EXIFNamesOlympus2030[
|
|
3738
|
+
name = EXIFNamesOlympus2030[id];
|
|
1923
3739
|
}
|
|
1924
|
-
else if (
|
|
3740
|
+
else if (parentId == 0x2040)
|
|
1925
3741
|
{
|
|
1926
|
-
name = EXIFNamesOlympus2040[
|
|
3742
|
+
name = EXIFNamesOlympus2040[id];
|
|
1927
3743
|
}
|
|
1928
|
-
else if (
|
|
3744
|
+
else if (parentId == 0x2050)
|
|
1929
3745
|
{
|
|
1930
|
-
name = EXIFNamesOlympus2050[
|
|
3746
|
+
name = EXIFNamesOlympus2050[id];
|
|
1931
3747
|
}
|
|
1932
3748
|
}
|
|
1933
|
-
return name || ("Tag "+
|
|
3749
|
+
return name || ("Tag "+id);
|
|
1934
3750
|
}
|
|
1935
3751
|
|
|
1936
3752
|
/**
|
|
@@ -2125,7 +3941,15 @@ export class EXIFData
|
|
|
2125
3941
|
}
|
|
2126
3942
|
else
|
|
2127
3943
|
{
|
|
2128
|
-
|
|
3944
|
+
try
|
|
3945
|
+
{
|
|
3946
|
+
exif.addUInt16(tag, reader.readUInt16Arr(reader.readUInt32(ifdOfst + 8, lsb) + readBase, lsb, fcnt));
|
|
3947
|
+
}
|
|
3948
|
+
catch (e)
|
|
3949
|
+
{
|
|
3950
|
+
console.log("Error in parsing file", e, ifdOfst, readBase, lsb, fcnt, tag);
|
|
3951
|
+
console.log(reader, reader.getLength(), reader.readUInt32(ifdOfst + 8, lsb));
|
|
3952
|
+
}
|
|
2129
3953
|
}
|
|
2130
3954
|
break;
|
|
2131
3955
|
}
|