@lodev09/react-native-exify 0.1.0

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.
Files changed (34) hide show
  1. package/Exify.podspec +41 -0
  2. package/LICENSE +20 -0
  3. package/README.md +50 -0
  4. package/android/build.gradle +95 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/AndroidManifestNew.xml +2 -0
  8. package/android/src/main/java/com/exify/ExifyModule.kt +99 -0
  9. package/android/src/main/java/com/exify/ExifyPackage.kt +17 -0
  10. package/android/src/main/java/com/exify/ExifyTags.kt +142 -0
  11. package/android/src/main/java/com/exify/ExifyUtils.kt +41 -0
  12. package/ios/Exify-Bridging-Header.h +11 -0
  13. package/ios/Exify.mm +28 -0
  14. package/ios/Exify.swift +131 -0
  15. package/ios/Exify.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  16. package/ios/Exify.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  17. package/ios/Exify.xcodeproj/project.xcworkspace/xcuserdata/lodev09.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  18. package/ios/Exify.xcodeproj/xcuserdata/lodev09.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  19. package/ios/ExifyUtils.swift +131 -0
  20. package/lib/commonjs/index.js +53 -0
  21. package/lib/commonjs/index.js.map +1 -0
  22. package/lib/commonjs/types.js +2 -0
  23. package/lib/commonjs/types.js.map +1 -0
  24. package/lib/module/index.js +31 -0
  25. package/lib/module/index.js.map +1 -0
  26. package/lib/module/types.js +2 -0
  27. package/lib/module/types.js.map +1 -0
  28. package/lib/typescript/src/index.d.ts +16 -0
  29. package/lib/typescript/src/index.d.ts.map +1 -0
  30. package/lib/typescript/src/types.d.ts +161 -0
  31. package/lib/typescript/src/types.d.ts.map +1 -0
  32. package/package.json +181 -0
  33. package/src/index.ts +40 -0
  34. package/src/types.ts +161 -0
@@ -0,0 +1,131 @@
1
+ /*
2
+ *
3
+ * Created by Jovanni Lo (@lodev09)
4
+ * Copyright 2024
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+
10
+ import PhotosUI
11
+
12
+ @objc(Exify)
13
+ class Exify: NSObject {
14
+
15
+ func readFromFile(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
16
+ let metadata = getMetadata(from: URL(string: uri))
17
+ resolve(getExifTags(from: metadata))
18
+ }
19
+
20
+ func readFromAsset(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
21
+ let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
22
+ guard let asset = getAssetBy(id: assetId) else {
23
+ resolve(nil)
24
+ return
25
+ }
26
+
27
+ let imageOptions = PHContentEditingInputRequestOptions()
28
+ imageOptions.isNetworkAccessAllowed = true
29
+
30
+ asset.requestContentEditingInput(with: imageOptions) { contentInput, info in
31
+ guard let url = contentInput?.fullSizeImageURL else {
32
+ resolve(nil)
33
+ return
34
+ }
35
+
36
+ let metadata = getMetadata(from: url)
37
+ resolve(getExifTags(from: metadata))
38
+ }
39
+ }
40
+
41
+ func writeToAsset(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
42
+ let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
43
+ guard let asset = getAssetBy(id: assetId) else {
44
+ reject("Error", "Cannot retrieve asset.", nil)
45
+ return
46
+ }
47
+
48
+ let imageOptions = PHContentEditingInputRequestOptions()
49
+ imageOptions.isNetworkAccessAllowed = true
50
+
51
+ asset.requestContentEditingInput(with: imageOptions) { contentInput, _ in
52
+ guard let contentInput, let url = contentInput.fullSizeImageURL else {
53
+ reject("Error", "Unable to read metadata from asset", nil)
54
+ return
55
+ }
56
+
57
+ updateMetadata(url: url, with: tags) { metadata, data in
58
+ guard let metadata, let data else {
59
+ reject("Error", "Could not update metadata", nil)
60
+ return
61
+ }
62
+
63
+ do {
64
+ try PHPhotoLibrary.shared().performChangesAndWait{
65
+ let request = PHAssetCreationRequest.forAsset()
66
+ request.addResource(with: .photo, data: data, options: nil)
67
+ request.creationDate = Date()
68
+
69
+ let assetId = request.placeholderForCreatedAsset!.localIdentifier
70
+ resolve([
71
+ "uri": "ph://\(assetId)",
72
+ "assetId": assetId,
73
+ "tags": getExifTags(from: metadata),
74
+ ])
75
+
76
+ }
77
+ } catch let error {
78
+ reject("Error", "Could not save to image file", nil)
79
+ print(error)
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ func writeToLocal(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
86
+ guard let url = URL(string: uri) else {
87
+ reject("Error", "Invalid URL", nil)
88
+ return
89
+ }
90
+
91
+ updateMetadata(url: url, with: tags) { metadata, data in
92
+ guard let metadata, let data else {
93
+ reject("Error", "Could not update metadata", nil)
94
+ return
95
+ }
96
+
97
+ do {
98
+ // Write to the current file
99
+ try data.write(to: url, options: .atomic)
100
+
101
+ resolve([
102
+ "uri": uri,
103
+ "assetId": nil,
104
+ "tags": getExifTags(from: metadata),
105
+ ])
106
+
107
+ } catch let error {
108
+ reject("Error", "Could not save to image file", nil)
109
+ print(error)
110
+ }
111
+ }
112
+ }
113
+
114
+ @objc(readAsync:withResolver:withRejecter:)
115
+ func readAsync(uri: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
116
+ if uri.starts(with: "ph://") {
117
+ readFromAsset(uri: uri, resolve: resolve)
118
+ } else {
119
+ readFromFile(uri: uri, resolve: resolve)
120
+ }
121
+ }
122
+
123
+ @objc(writeAsync:withExif:withResolver:withRejecter:)
124
+ func writeAsync(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
125
+ if uri.starts(with: "ph://") {
126
+ writeToAsset(uri: uri, tags: tags, resolve: resolve, reject: reject)
127
+ } else {
128
+ writeToLocal(uri: uri, tags: tags, resolve: resolve, reject: reject)
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Workspace
3
+ version = "1.0">
4
+ <FileRef
5
+ location = "self:">
6
+ </FileRef>
7
+ </Workspace>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IDEDidComputeMac32BitWarning</key>
6
+ <true/>
7
+ </dict>
8
+ </plist>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>Exify.xcscheme_^#shared#^_</key>
8
+ <dict>
9
+ <key>orderHint</key>
10
+ <integer>0</integer>
11
+ </dict>
12
+ </dict>
13
+ </dict>
14
+ </plist>
@@ -0,0 +1,131 @@
1
+ /*
2
+ *
3
+ * Created by Jovanni Lo (@lodev09)
4
+ * Copyright 2024
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+
10
+ import Photos
11
+
12
+ func getAssetBy(id: String?) -> PHAsset? {
13
+ if let id {
14
+ return getAssetsBy(assetIds: [id]).firstObject
15
+ }
16
+
17
+ return nil
18
+ }
19
+
20
+ func getAssetsBy(assetIds: [String]) -> PHFetchResult<PHAsset> {
21
+ let options = PHFetchOptions()
22
+
23
+ options.includeHiddenAssets = true
24
+ options.includeAllBurstAssets = true
25
+ options.fetchLimit = assetIds.count
26
+
27
+ return PHAsset.fetchAssets(withLocalIdentifiers: assetIds, options: options)
28
+ }
29
+
30
+ func addTagEntries(from dictionary: CFString, metadata: NSDictionary, to tags: NSMutableDictionary) -> Void {
31
+ if let entries = metadata[dictionary] as? [String: Any] {
32
+ tags.addEntries(from: entries)
33
+ }
34
+ }
35
+
36
+ func getExifTags(from metadata: NSDictionary) -> [String: Any] {
37
+ let tags: NSMutableDictionary = [:]
38
+
39
+ // Add root non-dictionary properties
40
+ for (key, value) in metadata {
41
+ if value as? [String: Any] == nil {
42
+ tags[key] = value
43
+ }
44
+ }
45
+
46
+ // Append all {Exif} properties
47
+ addTagEntries(from: kCGImagePropertyExifDictionary, metadata: metadata, to: tags)
48
+
49
+ // Prefix {GPS} dictionary with "GPS"
50
+ if let gps = metadata[kCGImagePropertyGPSDictionary as String] as? [String: Any] {
51
+ for (key, value) in gps {
52
+ tags["GPS" + key] = value
53
+ }
54
+ }
55
+
56
+ // Include tags from formats
57
+ addTagEntries(from: kCGImagePropertyTIFFDictionary, metadata: metadata, to: tags)
58
+ addTagEntries(from: kCGImagePropertyPNGDictionary, metadata: metadata, to: tags)
59
+ addTagEntries(from: kCGImagePropertyHEICSDictionary, metadata: metadata, to: tags)
60
+
61
+ return tags as! [String: Any]
62
+ }
63
+
64
+ func getMetadata(from url: URL?) -> NSMutableDictionary {
65
+ guard let url, let sourceImage = CGImageSourceCreateWithURL(url as CFURL, nil),
66
+ let metadataDict = CGImageSourceCopyPropertiesAtIndex(sourceImage, 0, nil) else {
67
+ return [:]
68
+ }
69
+
70
+ return NSMutableDictionary(dictionary: metadataDict)
71
+ }
72
+
73
+ func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDictionary?, Data?) -> Void) -> Void {
74
+ let metadata = getMetadata(from: url)
75
+
76
+ // Append additional Exif data
77
+ let exifDict = metadata[kCGImagePropertyExifDictionary as String] as? NSMutableDictionary
78
+ exifDict!.addEntries(from: tags)
79
+
80
+ // Handle GPS Tags
81
+ var gpsDict = [String: Any]()
82
+
83
+ if let latitude = tags["GPSLatitude"] as? Double {
84
+ gpsDict[kCGImagePropertyGPSLatitude as String] = abs(latitude)
85
+ gpsDict[kCGImagePropertyGPSLatitudeRef as String] = latitude >= 0 ? "N" : "S"
86
+ }
87
+
88
+ if let longitude = tags["GPSLongitude"] as? Double {
89
+ gpsDict[kCGImagePropertyGPSLongitude as String] = abs(longitude)
90
+ gpsDict[kCGImagePropertyGPSLongitudeRef as String] = longitude >= 0 ? "E" : "W"
91
+ }
92
+
93
+ if let altitude = tags["GPSAltitude"] as? Double {
94
+ gpsDict[kCGImagePropertyGPSAltitude as String] = abs(altitude)
95
+ gpsDict[kCGImagePropertyGPSAltitudeRef as String] = altitude >= 0 ? 0 : 1
96
+ }
97
+
98
+ if let gpsDate = tags["GPSDateStamp"] as? String {
99
+ gpsDict[kCGImagePropertyGPSDateStamp as String] = gpsDate
100
+ }
101
+
102
+ if let gpsTime = tags["GPSTimeStamp"] as? String {
103
+ gpsDict[kCGImagePropertyGPSTimeStamp as String] = gpsTime
104
+ }
105
+
106
+
107
+ if metadata[kCGImagePropertyGPSDictionary as String] == nil {
108
+ metadata[kCGImagePropertyGPSDictionary as String] = gpsDict
109
+ } else {
110
+ if let metadataGpsDict = metadata[kCGImagePropertyGPSDictionary as String] as? NSMutableDictionary {
111
+ metadataGpsDict.addEntries(from: gpsDict)
112
+ }
113
+ }
114
+
115
+ metadata.setObject(NSNumber(value: 1), forKey: kCGImageDestinationLossyCompressionQuality as NSString)
116
+
117
+ let destinationData = NSMutableData()
118
+
119
+ guard let uiImage = UIImage(contentsOfFile: url.path),
120
+ let sourceData = uiImage.jpegData(compressionQuality: 1.0) as CFData?,
121
+ let cgImageSource = CGImageSourceCreateWithData(sourceData, nil),
122
+ let sourceType = CGImageSourceGetType(cgImageSource),
123
+ let destination = CGImageDestinationCreateWithData(destinationData, sourceType, 1, nil) else {
124
+ return
125
+ }
126
+
127
+ CGImageDestinationAddImage(destination, uiImage.cgImage!, metadata)
128
+ if CGImageDestinationFinalize(destination) {
129
+ completionHanlder(metadata, destinationData as Data)
130
+ }
131
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {
7
+ writeAsync: true,
8
+ readAsync: true
9
+ };
10
+ exports.readAsync = readAsync;
11
+ exports.writeAsync = writeAsync;
12
+ var _reactNative = require("react-native");
13
+ var _types = require("./types");
14
+ Object.keys(_types).forEach(function (key) {
15
+ if (key === "default" || key === "__esModule") return;
16
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
17
+ if (key in exports && exports[key] === _types[key]) return;
18
+ Object.defineProperty(exports, key, {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _types[key];
22
+ }
23
+ });
24
+ });
25
+ const LINKING_ERROR = `The package '@lodev09/react-native-exify' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
26
+ ios: "- You have run 'pod install'\n",
27
+ default: ''
28
+ }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
29
+ const Exify = _reactNative.NativeModules.Exify ? _reactNative.NativeModules.Exify : new Proxy({}, {
30
+ get() {
31
+ throw new Error(LINKING_ERROR);
32
+ }
33
+ });
34
+
35
+ /**
36
+ * Write Exif data into an image file.
37
+ * @param {string} uri the image uri to write
38
+ * @param {ExifTags} tags the exif tags to be written
39
+ * @return {Promise<ExifyWriteResult>} the full exif tags of the image
40
+ */
41
+ function writeAsync(uri, tags) {
42
+ return Exify.writeAsync(uri, tags);
43
+ }
44
+
45
+ /**
46
+ * Read Exif data from an image file.
47
+ * @param {string} uri the image uri to read
48
+ * @return {Promise<ExifTags>} the raw exif tags of the image
49
+ */
50
+ function readAsync(uri) {
51
+ return Exify.readAsync(uri);
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_types","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","LINKING_ERROR","Platform","select","ios","default","Exify","NativeModules","Proxy","Error","writeAsync","uri","tags","readAsync"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAuCA,IAAAC,MAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AApCA,MAAMS,aAAa,GAChB,sFAAqF,GACtFC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,KAAK,GAAGC,0BAAa,CAACD,KAAK,GAC7BC,0BAAa,CAACD,KAAK,GACnB,IAAIE,KAAK,CACP,CAAC,CAAC,EACF;EACER,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIS,KAAK,CAACR,aAAa,CAAC;EAChC;AACF,CACF,CAAC;;AAEL;AACA;AACA;AACA;AACA;AACA;AACO,SAASS,UAAUA,CAACC,GAAW,EAAEC,IAAc,EAAyC;EAC7F,OAAON,KAAK,CAACI,UAAU,CAACC,GAAG,EAAEC,IAAI,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,SAASA,CAACF,GAAW,EAAiC;EACpE,OAAOL,KAAK,CAACO,SAAS,CAACF,GAAG,CAAC;AAC7B","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,31 @@
1
+ import { NativeModules, Platform } from 'react-native';
2
+ const LINKING_ERROR = `The package '@lodev09/react-native-exify' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
3
+ ios: "- You have run 'pod install'\n",
4
+ default: ''
5
+ }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
6
+ const Exify = NativeModules.Exify ? NativeModules.Exify : new Proxy({}, {
7
+ get() {
8
+ throw new Error(LINKING_ERROR);
9
+ }
10
+ });
11
+
12
+ /**
13
+ * Write Exif data into an image file.
14
+ * @param {string} uri the image uri to write
15
+ * @param {ExifTags} tags the exif tags to be written
16
+ * @return {Promise<ExifyWriteResult>} the full exif tags of the image
17
+ */
18
+ export function writeAsync(uri, tags) {
19
+ return Exify.writeAsync(uri, tags);
20
+ }
21
+
22
+ /**
23
+ * Read Exif data from an image file.
24
+ * @param {string} uri the image uri to read
25
+ * @return {Promise<ExifTags>} the raw exif tags of the image
26
+ */
27
+ export function readAsync(uri) {
28
+ return Exify.readAsync(uri);
29
+ }
30
+ export * from './types';
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","LINKING_ERROR","select","ios","default","Exify","Proxy","get","Error","writeAsync","uri","tags","readAsync"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,MAAMC,aAAa,GAChB,sFAAqF,GACtFD,QAAQ,CAACE,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,KAAK,GAAGN,aAAa,CAACM,KAAK,GAC7BN,aAAa,CAACM,KAAK,GACnB,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASQ,UAAUA,CAACC,GAAW,EAAEC,IAAc,EAAyC;EAC7F,OAAON,KAAK,CAACI,UAAU,CAACC,GAAG,EAAEC,IAAI,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACF,GAAW,EAAiC;EACpE,OAAOL,KAAK,CAACO,SAAS,CAACF,GAAG,CAAC;AAC7B;AAEA,cAAc,SAAS","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ import type { ExifTags, ExifyWriteResult } from './types';
2
+ /**
3
+ * Write Exif data into an image file.
4
+ * @param {string} uri the image uri to write
5
+ * @param {ExifTags} tags the exif tags to be written
6
+ * @return {Promise<ExifyWriteResult>} the full exif tags of the image
7
+ */
8
+ export declare function writeAsync(uri: string, tags: ExifTags): Promise<ExifyWriteResult | undefined>;
9
+ /**
10
+ * Read Exif data from an image file.
11
+ * @param {string} uri the image uri to read
12
+ * @return {Promise<ExifTags>} the raw exif tags of the image
13
+ */
14
+ export declare function readAsync(uri: string): Promise<ExifTags | undefined>;
15
+ export * from './types';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAmBzD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAE7F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAEpE;AAED,cAAc,SAAS,CAAA"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * From Android's ExifInterface Tags
3
+ */
4
+ export interface ExifTags {
5
+ SensorLeftBorder?: number;
6
+ SensorBottomBorder?: number;
7
+ DefaultCropSize?: number;
8
+ GPSTrackRef?: string;
9
+ GPSSpeedRef?: string;
10
+ GPSSpeed?: number;
11
+ GPSMapDatum?: string;
12
+ GPSLatitudeRef?: string;
13
+ GPSLatitude?: number;
14
+ GPSDifferential?: number;
15
+ GPSDestLatitudeRef?: string;
16
+ GPSDestDistanceRef?: string;
17
+ GPSHPositioningError?: string;
18
+ GPSDestDistance?: number;
19
+ GPSDestBearing?: number;
20
+ GPSDateStamp?: string;
21
+ GPSAltitudeRef?: number;
22
+ GPSAltitude?: number;
23
+ GPSDestLatitude?: number;
24
+ GPSImgDirection?: number;
25
+ GPSDOP?: number;
26
+ GPSTrack?: number;
27
+ GPSVersionID?: string;
28
+ GPSLongitude?: number;
29
+ GPSDestLongitudeRef?: string;
30
+ GPSImgDirectionRef?: string;
31
+ GPSProcessingMethod?: string;
32
+ GPSMeasureMode?: string;
33
+ GPSLongitudeRef?: string;
34
+ GPSSatellites?: string;
35
+ GPSAreaInformation?: string;
36
+ GPSDestBearingRef?: string;
37
+ GPSStatus?: string;
38
+ GPSTimeStamp?: string;
39
+ GPSDestLongitude?: number;
40
+ SensorTopBorder?: number;
41
+ Copyright?: string;
42
+ PreviewImageStart?: number;
43
+ SubSecTimeDigitized?: string;
44
+ SubSecTime?: string;
45
+ SubfileType?: number;
46
+ SpectralSensitivity?: string;
47
+ SpatialFrequencyResponse?: string;
48
+ DNGVersion?: number;
49
+ Sharpness?: number;
50
+ PixelXDimension?: number;
51
+ SceneCaptureType?: number;
52
+ ExposureTime?: number;
53
+ RelatedSoundFile?: string;
54
+ AspectFrame?: number;
55
+ Flash?: number;
56
+ SceneType?: string;
57
+ OECF?: string;
58
+ NewSubfileType?: number;
59
+ PixelYDimension?: number;
60
+ MakerNote?: string;
61
+ ShutterSpeedValue?: number;
62
+ LightSource?: number;
63
+ UserComment?: string;
64
+ GainControl?: number;
65
+ ISOSpeedRatings?: number[];
66
+ FocalPlaneResolutionUnit?: number;
67
+ FocalPlaneXResolution?: number;
68
+ YCbCrCoefficients?: number;
69
+ FocalLengthIn35mmFilm?: number;
70
+ LensMake?: string;
71
+ LensModel?: string;
72
+ LensSpecification?: number[];
73
+ ISO?: number;
74
+ FlashpixVersion?: number[];
75
+ StripOffsets?: number;
76
+ SensingMethod?: number;
77
+ FlashEnergy?: number;
78
+ FocalLength?: number;
79
+ FNumber?: number;
80
+ MeteringMode?: number;
81
+ FocalPlaneYResolution?: number;
82
+ ExposureBiasValue?: number;
83
+ ExposureProgram?: number;
84
+ SubjectDistance?: number;
85
+ ThumbnailImageLength?: number;
86
+ Compression?: number;
87
+ ExposureMode?: number;
88
+ ExposureIndex?: number;
89
+ WhiteBalance?: number;
90
+ DateTimeOriginal?: string;
91
+ RowsPerStrip?: number;
92
+ DateTimeDigitized?: string;
93
+ ExifVersion?: number[];
94
+ Saturation?: number;
95
+ CustomRendered?: number;
96
+ Contrast?: number;
97
+ ComponentsConfiguration?: number[];
98
+ ColorSpace?: number;
99
+ SubjectLocation?: number;
100
+ ThumbnailImageWidth?: number;
101
+ BrightnessValue?: number;
102
+ Model?: string;
103
+ InteroperabilityIndex?: string;
104
+ CompressedBitsPerPixel?: number;
105
+ ApertureValue?: number;
106
+ DeviceSettingDescription?: string;
107
+ JPEGInterchangeFormat?: number;
108
+ StripByteCounts?: number;
109
+ YCbCrSubSampling?: number;
110
+ DigitalZoomRatio?: number;
111
+ PreviewImageLength?: number;
112
+ YCbCrPositioning?: number;
113
+ FileSource?: string;
114
+ Artist?: string;
115
+ Make?: string;
116
+ CFAPattern?: string;
117
+ WhitePoint?: number;
118
+ SamplesPerPixel?: number;
119
+ SubjectArea?: number[];
120
+ JPEGInterchangeFormatLength?: number;
121
+ ResolutionUnit?: number;
122
+ PrimaryChromaticities?: number;
123
+ PlanarConfiguration?: number;
124
+ TransferFunction?: number;
125
+ SubSecTimeOriginal?: string;
126
+ Orientation?: number;
127
+ PhotometricInterpretation?: number;
128
+ MaxApertureValue?: number;
129
+ ImageDescription?: string;
130
+ SensorRightBorder?: number;
131
+ YResolution?: number;
132
+ BitsPerSample?: number;
133
+ ImageUniqueID?: string;
134
+ DateTime?: string;
135
+ ImageWidth?: number;
136
+ ReferenceBlackWhite?: number;
137
+ ImageLength?: number;
138
+ SubjectDistanceRange?: number;
139
+ XResolution?: number;
140
+ Software?: string;
141
+ [key: string]: unknown;
142
+ }
143
+ /**
144
+ * Exify `writeAsync` result data
145
+ */
146
+ export interface ExifyWriteResult {
147
+ /**
148
+ * The URI of the image that was written.
149
+ * On IOS asset, this will be new URI created.
150
+ */
151
+ uri?: string;
152
+ /**
153
+ * Media Library Asset ID
154
+ */
155
+ assetId?: string | null;
156
+ /**
157
+ * Raw EXIF data from the platform
158
+ */
159
+ tags?: ExifTags;
160
+ }
161
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}