@lodev09/react-native-exify 0.2.0 → 0.2.1
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/README.md +7 -5
- package/android/build.gradle +2 -2
- package/ios/Exify.swift +22 -15
- package/ios/ExifyUtils.swift +10 -6
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# React Native Exify
|
|
2
2
|
|
|
3
|
-
A simple library to read and write image Exif metadata in React Native.
|
|
3
|
+
A simple library to read and write image Exif metadata in React Native. Inspired from [this thread](https://github.com/mrousavy/react-native-vision-camera/issues/780).
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
- Read Exif data from an image
|
|
@@ -33,15 +33,17 @@ console.log(tags)
|
|
|
33
33
|
```ts
|
|
34
34
|
const uri = 'file://path/to/image.jpg'
|
|
35
35
|
const newTags: ExifTags = {
|
|
36
|
-
GPSLatitude: 69.
|
|
37
|
-
GPSLongitude: 69.
|
|
36
|
+
GPSLatitude: 69.69,
|
|
37
|
+
GPSLongitude: 69.69,
|
|
38
38
|
UserComment: 'Someone wrote GPS here!',
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const result = await writeAsync(uri, newTags)
|
|
42
|
-
console.log(result)
|
|
42
|
+
console.log(result.tags)
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
See [example](example) for more detailed usage.
|
|
46
|
+
|
|
45
47
|
💡 Note: On IOS, writing exif into an Asset file will duplicate the image.
|
|
46
48
|
Try to write to a local file first before saving!
|
|
47
49
|
|
package/android/build.gradle
CHANGED
|
@@ -87,9 +87,9 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
|
87
87
|
dependencies {
|
|
88
88
|
// For < 0.71, this will be from the local maven repo
|
|
89
89
|
// For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
|
|
90
|
-
//noinspection GradleDynamicVersion
|
|
90
|
+
// noinspection GradleDynamicVersion
|
|
91
91
|
implementation "com.facebook.react:react-native:+"
|
|
92
92
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
93
|
-
implementation
|
|
93
|
+
implementation "androidx.exifinterface:exifinterface:1.3.7"
|
|
94
94
|
}
|
|
95
95
|
|
package/ios/Exify.swift
CHANGED
|
@@ -11,14 +11,19 @@ import PhotosUI
|
|
|
11
11
|
|
|
12
12
|
@objc(Exify)
|
|
13
13
|
class Exify: NSObject {
|
|
14
|
-
|
|
15
|
-
func
|
|
16
|
-
let
|
|
17
|
-
|
|
14
|
+
|
|
15
|
+
func readExif(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
|
|
16
|
+
guard let url = URL(string: uri) else {
|
|
17
|
+
resolve(nil)
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
readExifTags(from: url) { tags in
|
|
22
|
+
resolve(tags)
|
|
23
|
+
}
|
|
18
24
|
}
|
|
19
25
|
|
|
20
|
-
func
|
|
21
|
-
let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
|
|
26
|
+
func readExif(assetId: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
|
|
22
27
|
guard let asset = getAssetBy(id: assetId) else {
|
|
23
28
|
resolve(nil)
|
|
24
29
|
return
|
|
@@ -33,13 +38,13 @@ class Exify: NSObject {
|
|
|
33
38
|
return
|
|
34
39
|
}
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
readExifTags(from: url) { tags in
|
|
42
|
+
resolve(tags)
|
|
43
|
+
}
|
|
38
44
|
}
|
|
39
45
|
}
|
|
40
46
|
|
|
41
|
-
func
|
|
42
|
-
let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
|
|
47
|
+
func writeExif(assetId: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
43
48
|
guard let asset = getAssetBy(id: assetId) else {
|
|
44
49
|
reject("Error", "Cannot retrieve asset.", nil)
|
|
45
50
|
return
|
|
@@ -82,7 +87,7 @@ class Exify: NSObject {
|
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
89
|
|
|
85
|
-
func
|
|
90
|
+
func writeExif(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
86
91
|
guard let url = URL(string: uri) else {
|
|
87
92
|
reject("Error", "Invalid URL", nil)
|
|
88
93
|
return
|
|
@@ -114,18 +119,20 @@ class Exify: NSObject {
|
|
|
114
119
|
@objc(readAsync:withResolver:withRejecter:)
|
|
115
120
|
func readAsync(uri: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
116
121
|
if uri.starts(with: "ph://") {
|
|
117
|
-
|
|
122
|
+
let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
|
|
123
|
+
readExif(assetId: assetId, resolve: resolve)
|
|
118
124
|
} else {
|
|
119
|
-
|
|
125
|
+
readExif(uri: uri, resolve: resolve)
|
|
120
126
|
}
|
|
121
127
|
}
|
|
122
128
|
|
|
123
129
|
@objc(writeAsync:withExif:withResolver:withRejecter:)
|
|
124
130
|
func writeAsync(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
125
131
|
if uri.starts(with: "ph://") {
|
|
126
|
-
|
|
132
|
+
let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
|
|
133
|
+
writeExif(assetId: assetId, tags: tags, resolve: resolve, reject: reject)
|
|
127
134
|
} else {
|
|
128
|
-
|
|
135
|
+
writeExif(uri: uri, tags: tags, resolve: resolve, reject: reject)
|
|
129
136
|
}
|
|
130
137
|
}
|
|
131
138
|
}
|
package/ios/ExifyUtils.swift
CHANGED
|
@@ -61,17 +61,23 @@ func getExifTags(from metadata: NSDictionary) -> [String: Any] {
|
|
|
61
61
|
return tags as! [String: Any]
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
func
|
|
64
|
+
func readExifTags(from url: URL?, completionHandler: ([String: Any]?) -> Void) -> Void {
|
|
65
65
|
guard let url, let sourceImage = CGImageSourceCreateWithURL(url as CFURL, nil),
|
|
66
66
|
let metadataDict = CGImageSourceCopyPropertiesAtIndex(sourceImage, 0, nil) else {
|
|
67
|
-
return
|
|
67
|
+
return
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
let tags = getExifTags(from: metadataDict)
|
|
71
|
+
completionHandler(tags)
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDictionary?, Data?) -> Void) -> Void {
|
|
74
|
-
let
|
|
75
|
+
guard let cgImageSource = CGImageSourceCreateWithURL(url as CFURL, nil) else {
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let metadataDict = CGImageSourceCopyPropertiesAtIndex(cgImageSource, 0, nil) ?? [:] as CFDictionary
|
|
80
|
+
let metadata = NSMutableDictionary(dictionary: metadataDict)
|
|
75
81
|
|
|
76
82
|
// Append additional Exif data
|
|
77
83
|
let exifDict = metadata[kCGImagePropertyExifDictionary as String] as? NSMutableDictionary
|
|
@@ -117,8 +123,6 @@ func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDi
|
|
|
117
123
|
let destinationData = NSMutableData()
|
|
118
124
|
|
|
119
125
|
guard let uiImage = UIImage(contentsOfFile: url.path),
|
|
120
|
-
let sourceData = uiImage.jpegData(compressionQuality: 1.0) as CFData?,
|
|
121
|
-
let cgImageSource = CGImageSourceCreateWithData(sourceData, nil),
|
|
122
126
|
let sourceType = CGImageSourceGetType(cgImageSource),
|
|
123
127
|
let destination = CGImageDestinationCreateWithData(destinationData, sourceType, 1, nil) else {
|
|
124
128
|
return
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodev09/react-native-exify",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Read and write exif data into an image.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -116,7 +116,12 @@
|
|
|
116
116
|
"publish": true
|
|
117
117
|
},
|
|
118
118
|
"github": {
|
|
119
|
-
"release": true
|
|
119
|
+
"release": true,
|
|
120
|
+
"comments": {
|
|
121
|
+
"submit": true,
|
|
122
|
+
"issue": ":rocket: _This issue has been resolved in v${version}. See [${releaseName}](${releaseUrl}) for release notes._",
|
|
123
|
+
"pr": ":rocket: _This pull request is included in v${version}. See [${releaseName}](${releaseUrl}) for release notes._"
|
|
124
|
+
}
|
|
120
125
|
},
|
|
121
126
|
"plugins": {
|
|
122
127
|
"@release-it/conventional-changelog": {
|