|
9 | 9 | #import "RCTARKitManager.h" |
10 | 10 | #import "RCTARKit.h" |
11 | 11 | #import "RCTARKitNodes.h" |
| 12 | +#import <UIKit/UIKit.h> |
| 13 | +#import <Photos/Photos.h> |
12 | 14 |
|
13 | 15 | @implementation RCTARKitManager |
14 | 16 |
|
@@ -95,12 +97,104 @@ - (NSDictionary *)constantsToExport |
95 | 97 |
|
96 | 98 |
|
97 | 99 |
|
98 | | -RCT_EXPORT_METHOD(snapshot:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
99 | | - [[ARKit sharedInstance] snapshot:resolve reject:reject]; |
| 100 | +- (NSString *)getAssetUrl:(NSString *)localID { |
| 101 | + // thx https://stackoverflow.com/a/34788748/1463534 |
| 102 | + // heck, objective c is such a mess |
| 103 | + NSString * assetID = [localID stringByReplacingOccurrencesOfString:@"/.*" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [localID length])]; |
| 104 | + NSString * ext = @"JPG"; |
| 105 | + NSString * assetURLStr = [NSString stringWithFormat:@"assets-library://asset/asset.%@?id=%@&ext=%@", ext, assetID, ext]; |
| 106 | + return assetURLStr; |
100 | 107 | } |
101 | 108 |
|
102 | | -RCT_EXPORT_METHOD(snapshotCamera:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
103 | | - [[ARKit sharedInstance] snapshotCamera:resolve reject:reject]; |
| 109 | +- (void)storeImageInPhotoAlbum:(UIImage *)image reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { |
| 110 | + __block PHObjectPlaceholder *placeholder; |
| 111 | + |
| 112 | + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ |
| 113 | + PHAssetChangeRequest* createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; |
| 114 | + placeholder = [createAssetRequest placeholderForCreatedAsset]; |
| 115 | + |
| 116 | + } completionHandler:^(BOOL success, NSError *error) { |
| 117 | + if (success) |
| 118 | + { |
| 119 | + |
| 120 | + NSString * localID = placeholder.localIdentifier; |
| 121 | + |
| 122 | + NSString * assetURLStr = [self getAssetUrl:localID]; |
| 123 | + |
| 124 | + resolve(@{@"url": assetURLStr, @"width":@(image.size.width), @"height": @(image.size.height)}); |
| 125 | + } |
| 126 | + else |
| 127 | + { |
| 128 | + reject(@"snapshot_error", @"Could not store snapshot", error); |
| 129 | + } |
| 130 | + }]; |
| 131 | +} |
| 132 | + |
| 133 | + |
| 134 | +- (void)storeImageInDirectory:(UIImage *)image directory:(NSString *)directory format:(NSString *)format reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { |
| 135 | + NSData *data; |
| 136 | + if([format isEqualToString:@"jpg"]) { |
| 137 | + data = UIImageJPEGRepresentation(image, 0.9); |
| 138 | + } else if([format isEqualToString:@"png"]) { |
| 139 | + data = UIImagePNGRepresentation(image); |
| 140 | + } else { |
| 141 | + reject(@"snapshot_error", [NSString stringWithFormat:@"unkown file format '%@'", format], nil); |
| 142 | + return; |
| 143 | + } |
| 144 | + NSString *prefixString = @"capture"; |
| 145 | + |
| 146 | + NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ; |
| 147 | + NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@.%@", prefixString, guid, format]; |
| 148 | + |
| 149 | + NSString *filePath = [directory stringByAppendingPathComponent:uniqueFileName]; //Add the file name |
| 150 | + bool success = [data writeToFile:filePath atomically:YES]; //Write the file |
| 151 | + if(success) { |
| 152 | + resolve(@{@"url": filePath, @"width":@(image.size.width), @"height": @(image.size.height)}); |
| 153 | + } else { |
| 154 | + // TODO use NSError from writeToFile |
| 155 | + reject(@"snapshot_error", [NSString stringWithFormat:@"could not save to '%@'", filePath], nil); |
| 156 | + } |
| 157 | + |
| 158 | +} |
| 159 | + |
| 160 | +- (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { |
| 161 | + NSString * target = @"cameraRoll"; |
| 162 | + NSString * format = @"png"; |
| 163 | + |
| 164 | + if(options[@"target"]) { |
| 165 | + target = options[@"target"]; |
| 166 | + } |
| 167 | + if(options[@"format"]) { |
| 168 | + format = options[@"format"]; |
| 169 | + } |
| 170 | + if([target isEqualToString:@"cameraRoll"]) { |
| 171 | + // camera roll / photo album |
| 172 | + [self storeImageInPhotoAlbum:image reject:reject resolve:resolve]; |
| 173 | + } else { |
| 174 | + NSString * dir; |
| 175 | + if([target isEqualToString:@"cache"]) { |
| 176 | + dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; |
| 177 | + } else if([target isEqualToString:@"documents"]) { |
| 178 | + dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; |
| 179 | + |
| 180 | + } else { |
| 181 | + dir = target; |
| 182 | + } |
| 183 | + [self storeImageInDirectory:image directory:dir format:format reject:reject resolve:resolve]; |
| 184 | + } |
| 185 | +} |
| 186 | + |
| 187 | +RCT_EXPORT_METHOD(snapshot:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
| 188 | + UIImage *image = [[ARKit sharedInstance] getSnaphshot]; |
| 189 | + [self storeImage:image options:options reject:reject resolve:resolve]; |
| 190 | +} |
| 191 | + |
| 192 | + |
| 193 | + |
| 194 | + |
| 195 | +RCT_EXPORT_METHOD(snapshotCamera:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
| 196 | + UIImage *image = [[ARKit sharedInstance] getSnaphshotCamera]; |
| 197 | + [self storeImage:image options:options reject:reject resolve:resolve]; |
104 | 198 | } |
105 | 199 |
|
106 | 200 | RCT_EXPORT_METHOD(getCamera:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
@@ -138,3 +232,4 @@ - (NSDictionary *)constantsToExport |
138 | 232 | } |
139 | 233 |
|
140 | 234 | @end |
| 235 | + |
0 commit comments