菜鸟教程小白 发表于 2022-12-12 16:38:32

ios - 试图从 UIImagePickerController 中提取 GPS 元数据,但 NSLog 显示为 Null


                                            <p><p>使用 UIImagePickerController 我试图从图像的元数据中收集 GPS 信息。这是我的代码示例:</p>

<pre><code>NSDictionary *imageMetadata = ;
    NSLog(@&#34;Working META: %@&#34;,imageMetadata);

    CGDataProviderRef dataProvider = CGImageGetDataProvider(originalImage.CGImage);
    CFDataRef data = CGDataProviderCopyData(dataProvider);
    CGImageSourceRef imageSource = CGImageSourceCreateWithData(data, nil);
    NSDictionary *metaDict = (__bridge NSDictionary *)(CGImageSourceCopyProperties(imageSource, nil));
    NSLog(@&#34;Not WOrking META: %@&#34;,metaDict);
</code></pre>

<p>在 NSLog 的输出中,我可以看到 Working Meta 包含所有相关内容。不幸的是,Not Working Meta 正在输出 null。据我所知,我需要增强图像源和 CFDictionary 的选项,而不是使用 nil。我在正确的道路上吗?如果是这样,我应该做些什么改变来提取 GPS 数据?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>尝试像这样获取源 EXIF 字典的可变副本:</p>

<pre><code>UIImage *image =;
NSData *jpeg = UIImageJPEGRepresentation(image,image.scale);
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)jpeg, NULL);
NSDictionary *metadata = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
NSMutableDictionary *mutableMetadata = ;
</code></pre>

<p>现在将 GPS 数据设置为该 EXIF 字典(代码由 <a href="http://github.com/gpambrozio/GusUtils/blob/master/GusUtils" rel="noreferrer noopener nofollow">GusUtils</a> 提供):</p>

<pre><code>
</code></pre>

<p>最后,您需要将此数据填充到某个目的地</p>

<pre><code>CFStringRef UTI = CGImageSourceGetType(source);
NSMutableData *data = ;
CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef) data, UTI, 1, NULL);
CGImageDestinationAddImageFromSource(destination,source, 0, (__bridge CFDictionaryRef) mutableMetadata);
BOOL success = CGImageDestinationFinalize(destination);
</code></pre>

<p>此时变量<code>data</code>应该包含所有信息(图像+GPS元数据+其他元数据),你可以使用这个<code>data</code>来存储任何你喜欢的地方。</p>

<p><strong>编辑:</strong></p>

<p>要在您的类中添加核心位置功能,请在其中声明 CLLocationManagerDelegate 协议(protocol)
标题。在 <code>viewDidLoad</code> 中实例化一个位置管理器:</p>

<pre><code>self.locManager = ;
self.locManager.delegate = self;
self.locManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
self.locManager.distanceFilter = 5.0f; //location would be updated if moved by 5 miter
;
</code></pre>

<p>并实现以下方法来收集位置信息:</p>

<pre><code>-(void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations    {
if (!locations || == 0) {
    return;
}

CLLocation* loc = locations[ - 1];
if (loc.horizontalAccuracy &lt; 0) {
    return;
}
self.currentLocation = loc;
}
-(void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation*)oldLocation {
if (newLocation.horizontalAccuracy &lt; 0) {
    return;
}
self.currentLocation = newLocation;
}
-(void)locationManager:(CLLocationManager*)manager didFailWithError:(NSError*)error {
NSLog(@&#34;core location error: %@&#34;,);
if ( != kCLErrorLocationUnknown) {
    NSLog(@&#34;location service will terminate now&#34;);
    self.locManager.delegate = nil;
    ;

    self.currentLocation = nil;
}
}
</code></pre>

<p>还要确保在离开 VC 之前停止服务</p>

<pre><code>self.locManager.delegate = nil;
;
</code></pre>

<p>然后你可以使用 <code>self.currentLocation</code> 作为你的 `location 变量。</p>

<p><strong>EDIT2</strong></p>

<p>好吧,您似乎已经在使用来自 GusUtils 的“NSMutableDictionary+ImageMetadata.h”类别。所以我对我的答案做了一些修改。请试一试。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 试图从 UIImagePickerController 中提取 GPS 元数据,但 NSLog 显示为 Null,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/20105571/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/20105571/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 试图从 UIImagePickerController 中提取 GPS 元数据,但 NSLog 显示为 Null