@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.
- package/Exify.podspec +41 -0
- package/LICENSE +20 -0
- package/README.md +50 -0
- package/android/build.gradle +95 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/exify/ExifyModule.kt +99 -0
- package/android/src/main/java/com/exify/ExifyPackage.kt +17 -0
- package/android/src/main/java/com/exify/ExifyTags.kt +142 -0
- package/android/src/main/java/com/exify/ExifyUtils.kt +41 -0
- package/ios/Exify-Bridging-Header.h +11 -0
- package/ios/Exify.mm +28 -0
- package/ios/Exify.swift +131 -0
- package/ios/Exify.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/Exify.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/Exify.xcodeproj/project.xcworkspace/xcuserdata/lodev09.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/Exify.xcodeproj/xcuserdata/lodev09.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/ExifyUtils.swift +131 -0
- package/lib/commonjs/index.js +53 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/index.js +31 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +161 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +181 -0
- package/src/index.ts +40 -0
- package/src/types.ts +161 -0
package/ios/Exify.swift
ADDED
|
@@ -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
|
+
}
|
|
Binary file
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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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"}
|