【问题标题】:UIImage encoded to NSData in ObjectiveC and then decoded in SwiftUIImage 在 ObjectiveC 中编码为 NSData,然后在 Swift 中解码
【发布时间】:2016-08-10 03:03:54
【问题描述】:

我有一个最初是在 Objective C 中创建的应用程序(我们称之为版本 1),现在我已经将我的应用程序转换为 Swift 2.0(版本 2)。该应用程序的主要功能之一是能够将图像和文本从一台设备发送到另一台设备。图像和文本存储在 NSMutableDictionary 中,然后编码为 NSData 并发送/存储在 Parse 后端服务器上。我的应用程序的设计还可以通过电子邮件将图像从一台设备发送到另一台设备。

这适用于我的应用程序的两个版本——Objective C 和 Swift。太好了!

我的问题是当用户将 NSData 从我的应用程序的版本 1 发送到版本 2 的设备(基本上是在目标 C 中编码然后在 Swift 中解码的图像)时!!编码的文本可以很好地解码,但不能解码图像(保存为 objectForKey("data"))。请参见下面的示例。 quizData 是一个数组,包含从另一个设备发送的字典(keyValue 项)。此数组适用于除 objectForKey("data") 之外的所有项目。这个对象就是编码后的图像。

 var imageData = NSData()

imageData = quizData.objectAtIndex(currentQuestionNumber).objectForKey("data") as! NSData

  // the following always prints out lots of info to confirm the imageData has the encoded image
  print("imageData.length = \(imageData.length)")
  print("imageData.description = \(imageData.description)")

   // decoding
  photoImageView.image = UIImage(data:imageData)

好的,所以当图像是使用 Swift 在另一台设备上创建时,上述方法有效。但是,如果从版本 1(目标 c)创建和发送的图像,则 photoImageView 为空白(无错误)但 imageData 很大(打印输出显示 imageDate 确实保存了用户图像)。

Surley 如果 NSdata 对象具有 UIImage 的数据,它应该能够在 ObjC 或 Swift 中解码?如果需要,发送更多代码没问题

问题修改如下: 不确定这是否真的有帮助,但这里有用于通过电子邮件发送 NSData 的 objC 代码(所有应用程序数据都保存在 pList 中)

// emailArray to be populated with selected data from plist
NSMutableArray *emailArray = [NSMutableArray arrayWithContentsOfFile:path];

 MFMailComposeViewController *emailPicker = [[MFMailComposeViewController alloc]init];
 emailPicker.mailComposeDelegate =self;


/// NSdata from emailArray
NSData *emailQuizData = [NSKeyedArchiver  archivedDataWithRootObject:emailArray];
[emailPicker addAttachmentData:emailQuizData mimeType:@"application/quizApp" fileName:_quizNameLabel.text];

【问题讨论】:

  • 如果您向我们展示将图像数据编码为 NSData 并将其放入字典中的代码(Obj-C 代码)会有所帮助
  • 我也会尝试使用 Base64 图像编码解码。
  • 你的代码没有多大意义。 Objective-C 代码与 Swift 代码有什么关系? Objective-C 正在加载一些 plist 文件(内容未知),归档结果数组,并将归档作为电子邮件附件发送。 Swift 代码仅显示了从某个未知数组中获取 NSData 的尝试。 Swift 代码中的quizData 来自哪里?您的问题是从一台设备向另一台设备发送数据时出现问题。那是怎么做的。显示具有更多上下文的相关代码。
  • 我认为这与 swift 无关。基本上你的序列化/反序列化逻辑是不同的。发布该代码而不是您在此处的代码可能更有意义。
  • 首先检查图像是否真的被发送。我认为您首先为“数据”键发送 nil 。上面的代码没有显示您将数据发送到哪里。请检查一下。

标签: ios objective-c swift uiimage nsdata


【解决方案1】:

如果您使用 base64 编码,则不会出现此问题。

这是 swift 中的实现:

import UIKit

func base64StringForImage(image: UIImage) -> String? {
    guard let data = UIImagePNGRepresentation(image) else { return nil }
    return data.base64EncodedStringWithOptions([])
}

func imageFromBase64String(string: String) -> UIImage? {
    guard let data = NSData(base64EncodedString: string, options: []) else { return nil }
    return UIImage(data: data)
}

这是 objc 中的实现:

#import <UIKit/UIKit.h>

NS_INLINE NSString * base64StringForImage_objc(UIImage *image) {
    NSData *imageData = UIImagePNGRepresentation(image);
    return [imageData base64EncodedStringWithOptions:0];
}

NS_INLINE UIImage * imageFromBase64String_objc(NSString *string) {
    NSData *imageData = [[NSData alloc] initWithBase64EncodedString: string options: 0];
    return [[UIImage alloc] initWithData:imageData];
}

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2014-06-09
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多