gpt4 book ai didi

iphone - iOS : Select a GIF from the photo library, 转换为 NSData 以在 multipart/form-data 中使用

转载 作者:行者123 更新时间:2023-12-03 18:29:57 24 4
gpt4 key购买 nike

我的代码中当前正在运行的内容:

我从照片库中选择 JPG 或 PNG(使用标准 ImagePicker 方法),然后使用以下方法将该图像转换为 NSData:

self.myImageData = UIImageJPEGRepresentation(myImage, 0.9); 

然后我使用 multipart/form-data 将其发布到服务器。

我现在想对 GIF 执行相同的操作,同时保留原始 GIF 数据(以便进入库的动画 GIF 出来时仍具有动画效果)。

在 didFinishPickingMediaWithInfo 中,我可以使用

获取原始 GIF 的 URL
self.myGIFURL = [info objectForKey:UIImagePickerControllerReferenceURL]. 

这是一个可能会给我带来什么的例子:

assets-library://asset/asset.GIF?id=1000000034&ext=GIF

我现在尝试了两种方法将此 GIF 推送到 NSData 中,每次我的 myImageData 都显示 (null)。

我尝试使用 initWithContentsOfURL:

NSData *dataFromGIFURL = [[NSData alloc] initWithContentsOfURL: myGIFURL];
self.myImageData = dataFromGIFURL;
[dataFromGIFURL release];

然后我尝试将 NSURL 转换为 initWithContentsOfFile 的字符串:

NSString *stringFromURL = [NSString stringWithFormat:@"%@", myGIFURL];
NSData *dataFromGIFURL = [[NSData alloc] initWithContentsOfFile: stringFromURL];
self.myImageData = dataFromGIFURL;
[dataFromGIFURL release];

有什么建议吗?谢谢。

最佳答案

UIImagePickerControllerReferenceURL 键直到 iOS 4.1 才会出现。因此,我认为您的问题中隐含着使用 AssetsLibrary 框架是可以的,该框架仅在 iOS 4.0 中出现。在这种情况下,您可以使用以下内容:

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:[info objectForKey:UIImagePickerControllerReferenceURL]
resultBlock:^(ALAsset *asset)
{
ALAssetRepresentation *representation = [asset defaultRepresentation];

NSLog(@"size of asset in bytes: %d", [representation size]);

unsigned char bytes[4];
[representation getBytes:bytes fromOffset:0 length:4 error:nil];
NSLog(@"first four bytes: %02x (%c) %02x (%c) %02x (%c) %02x (%c)",
bytes[0], bytes[0],
bytes[1], bytes[1],
bytes[2], bytes[2],
bytes[3], bytes[3]);

[library autorelease];
}
failureBlock:^(NSError *error)
{
NSLog(@"couldn't get asset: %@", error);

[library autorelease];
}
];
}

因此,您创建一个 ALAssetsLibrary,要求它为您找到指定 URL 的 Assets (它理解 asset-library://URL 方案),然后当您获取该 Assets 时,您将获取其默认表示形式并使用它来给你字节。它们将是实际的磁盘字节,库中资源的默认表示形式是其磁盘形式。

例如,从连接到具有该方法的委托(delegate)的图像选择器中,选择我从 Google 图像中随机抓取的特定 GIF 会给出输出:

2011-03-03 23:17:37.451IPTest[1199:307] size of asset inbytes: 174960

2011-03-03 23:17:37.459IPTest[1199:307] first four bytes: 47(G) 49 (I) 46 (F) 38 (8)

这就是标准 GIF 标题的开始。选择 PNG 或 JPG 会给出 PNG 和 JPG header 的可识别的前四个字节。

编辑:为了完成这个想法,显然您可以使用 ALAssetRepresentation 将描述文件的所有字节读取到适当的 malloc'd C 数组中,然后使用 NSData +(id)dataWithBytes:length: (或者,更可能的是, +dataWithBytesNoCopy:length:freeWhenDone:) 将其包装到 NSData 中。

关于iphone - iOS : Select a GIF from the photo library, 转换为 NSData 以在 multipart/form-data 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com