【问题标题】:Saving image to Documents directory and retrieving for email attachment将图像保存到 Documents 目录并检索电子邮件附件
【发布时间】:2011-01-03 11:48:31
【问题描述】:

我无法确定 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"];

【问题讨论】:

  • 你能告诉我你是如何得到相机图像的吗?即对您使用相机拍摄的 UIImage 的引用。谢谢。
  • 在哪里调用 saveImage 操作。我是 Xcode 的新手。

标签: ios iphone email nsdocument


【解决方案1】:

因为每个 iPhone 应用程序都在它自己的沙箱中,所以您无权访问设备范围的文档文件夹。要将图像附加到电子邮件,请将图像保存在您自己的文档文件夹中。尝试使用 [@"~/Documents" StringByExpandingTildeInPath] 来获取您的本地文档文件夹 - 这对我有用。看起来您用于将图像附加到电子邮件的技术是正确的。

希望对你有帮助,

【讨论】:

  • 我在“;”之前收到一个预期的错误“:”在这一行: NSString *path = [[@"~Documents"] pathForResource:@"image" ofType:@"png"];有任何想法吗?谢谢你们的帮助。
  • 记得添加“stringByExpandingTildeInPath”部分。 (它必须是“~/Documents”,而不是“~Documents”。stringByExpandingTildeInPath 是 NSString 的一个方法,它会自动将 ~ 替换为用户主文件夹的路径。
【解决方案2】:
- (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”附加到电子邮件中?谢谢
  • [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"icon"];上面的“数据”是图像的nsdata表示。 “picker”是电子邮件组件。它已经附加了。
  • 将其保存到文档是否会自动为图像生成唯一的文件名?
  • 当你保存到文档时,你自己传入一个文件路径。您可以使用以下命令创建临时文件:stackoverflow.com/questions/215820/…
【解决方案3】:

试试这个:

 -(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];
}

【讨论】:

    【解决方案4】:

    斯威夫特 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,啊,是的,可能。感谢您的解释(以及纠正我的错误)。
    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2023-03-24
    • 2012-01-15
    • 1970-01-01
    • 2010-10-06
    • 2016-12-29
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多