将图像保存到“文档”目录并检索电子邮件附件


72

我在查明NSBundle&DocumentDirectory数据时遇到问题,我有一个要保存到的相机图片“ imageView ”,NSDocumentDirectoy然后想要检索它以附加到电子邮件中,

这里保存代码:

- (IBAction)saveImage {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *image = imageView.image; // imageView is my image from camera
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:NO];   
}

这是新的获取数据代码:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
    NSData *myData = [[[NSData alloc] initWithContentsOfFile:appFile] autorelease];
    [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"savedImage"];

1
您能先告诉我您如何获得相机图像吗?即对您使用相机拍摄的UIImage的引用。谢谢。
卸妆

在哪里调用saveImage操作。我是Xcode的新手。
NovusMobile

Answers:


66
- (IBAction)getImage {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *img = [UIImage imageWithContentsOfFile:getImagePath];
}

这应该让您开始!


谢谢,它与Ben的答案不同,但是电子邮件附件需要添加NSData,我必须在您的答案中缺少一些内容。我将如何在电子邮件中附加“ img:named”?谢谢
Michael Robinson 2010年

[picker addAttachmentData:myData mimeType:@“ image / png” fileName:@“ icon”];上面的“数据”是图像的nsdata表示。“选择器”是电子邮件组件。它已经连接了。
约旦2010年

是否将其保存到文档会自动为图像生成唯一的文件名?
zakdances 2012年

1
保存到文档时,您自己传递文件路径。您可以使用以下文件创建临时文件:stackoverflow.com/questions/215820/…–
Jordan

5

迅捷3

// Create a URL
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let imageURL = documentsURL?.appendingPathComponent("MyImageName.png")

// save image to URL
let myImage = imageView.image! // or wherever you have your UIImage

do {
    try UIImagePNGRepresentation(myImage)?.write(to: imageURL!)
} catch {}


// Use the URL to retrieve the image for sharing to email, social media, etc.
// docController.URL = imageURL
// ...

为了简洁起见,我强制展开了一些可选的选项。在代码中使用guardif let


实际上,有两种可用的情况-.documentationDirectory和和.documentDirectory,它们不是同一回事。问题是关于文档目录,所以我想您只是从代码完成建议中选择了一个错误的值;)
alexburtnik

@alexburtnik,啊,是的,可能是。感谢您的解释(并纠正了我的错误)。
Suragch

0

由于每个iPhone应用程序都位于其自己的沙箱中,因此您无权访问设备范围的文档文件夹。要将图像附加到电子邮件,请将图像保存在您自己的文档文件夹中。尝试使用[@“〜/ Documents” StringByExpandingTildeInPath]来获取本地文档文件夹-适用于我。您用于将图像附加到电子邮件的技术似乎是正确的。

希望能有所帮助,


我在“;”之前收到预期的错误“:” 在这一行:NSString * path = [[@“〜Documents”] pathForResource:@“ image” ofType:@“ png”]; 有任何想法吗?多谢您的协助。
Michael Robinson 2010年

记住要添加“ stringByExpandingTildeInPath”部分。(它必须是“〜/文稿”,而不是“〜文档” stringByExpandingTildeInPath是的NSString的方法,它会自动与路径到用户的主文件夹替换〜。
本Gotow

0

试试这个:

 -(void)setProfilePic
{
  NSArray *docpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [docpaths objectAtIndex:0];
  NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"Image.png"];

  NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL fileURLWithPath:imagePath]];
  UIImage *thumbNail = [[UIImage alloc] initWithData:imgData];
  [profilePic_btn setBackgroundImage:thumbNail forState:UIControlStateNormal];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.