Image Swift2从Firebase检索图像
我正在尝试从Firebase读取/显示图像。我首先对图像进行编码,然后将此编码字符串发布到Firebase。这个很好。当我尝试从Firebase解码编码字符串并将其转换为图像时,我得到一个nil值异常 这就是我将图像保存到Firebase的方式Image Swift2从Firebase检索图像,image,firebase,swift2,Image,Firebase,Swift2,我正在尝试从Firebase读取/显示图像。我首先对图像进行编码,然后将此编码字符串发布到Firebase。这个很好。当我尝试从Firebase解码编码字符串并将其转换为图像时,我得到一个nil值异常 这就是我将图像保存到Firebase的方式 var base64String: NSString! func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, e
var base64String: NSString!
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
self.dismissViewControllerAnimated(true, completion: nil)
imageToPost.image = image
var uploadImage = image as! UIImage
var imageData = UIImagePNGRepresentation(uploadImage)!
self.base64String = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
let ref = Firebase(url: "https://XXX.firebaseio.com")
var quoteString = ["string": self.base64String]
var usersRef = ref.childByAppendingPath("goalImages")
var users = ["image": quoteString]
usersRef.setValue(users)
displayAlert("Image Posted", message: "Your image has been successfully posted!")
}
这就是我试图从Firebase读取图像的方式
// ViewController.swift
import UIKit
import Firebase
class ViewController: UIViewController {
@IBOutlet weak var image: UIImageView!
var base64String: NSString!
@IBAction func buttonClicked(sender: AnyObject) {
sender.setTitle("\(sender.tag)", forState: UIControlState.Normal)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let ref = Firebase(url: "https://XXX.firebaseio.com/goalImages/image/string")
ref.observeEventType(.Value, withBlock: { snapshot in
self.base64String = snapshot.value as! NSString
let decodedData = NSData(base64EncodedString: self.base64String as String, options: NSDataBase64DecodingOptions())
//Next line is giving the error
var decodedImage = UIImage(data: decodedData!)
self.image.image = decodedImage
}, withCancelBlock: { error in
print(error.description)
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
错误为:“致命错误:在展开可选值时意外发现nil”;解码数据为零。有人能解释一下出了什么问题吗 而不是
let decodedData = NSData(base64EncodedString: self.base64String as String,
options: NSDataBase64DecodingOptions())
尝试添加忽略未知字符
NSDataBase64DecodingOptions.IgnoreUnknownCharacters
使用示例:编码jpg,存储并从firebase读取
编码并写出我们最喜欢的星际飞船
if let image = NSImage(named:"Enterprise.jpeg") {
let imageData = image.TIFFRepresentation
let base64String = imageData!.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
let imageRef = myRootRef.childByAppendingPath("image_path")
imageRef.setValue(base64String)
读解
imageRef.observeEventType(.Value, withBlock: { snapshot in
let base64EncodedString = snapshot.value
let imageData = NSData(base64EncodedString: base64EncodedString as! String,
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
let decodedImage = NSImage(data:imageData!)
self.myImageView.image = decodedImage
}, withCancelBlock: { error in
print(error.description)
})
编辑2019\u 05\u 17
更新至Swift 5和Firebase 6
func writeImage() {
if let image = NSImage(named:"Enterprise.jpg") {
let imageData = image.tiffRepresentation
if let base64String = imageData?.base64EncodedString() {
let imageRef = self.ref.child("image_path")
imageRef.setValue(base64String)
}
}
}
func readImage() {
let imageRef = self.ref.child("image_path")
imageRef.observeSingleEvent(of: .value, with: { snapshot in
let base64EncodedString = snapshot.value as! String
let imageData = Data(base64Encoded: base64EncodedString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!
let decodedImage = NSImage(data: imageData)
self.myImageView.image = decodedImage
})
}
消防基地工程师: 我强烈建议使用新的API将图像上载到Firebase。它使用简单,成本低,并且有强大的支持,可以实现大规模应用 您可以从指向本地文件的
NSData
或NSURL
上传(我将显示NSData
,但原理相同):
您甚至可以暂停和恢复上载,并且可以轻松监控上载进度:
// Upload data
let uploadTask = storageRef.putData(...)
// Add a progress observer to an upload task
uploadTask.observeStatus(.Progress) { snapshot in
// Upload reported progress
if let progress = snapshot.progress {
let percentComplete = 100.0 * Double(progress.completedUnitCount) / Double(progress.totalUnitCount)
}
}
试试NSDataBase64DecodingOptions.IgnoreUnknownCharacters我也有同样的问题,我用@jay的评论修复了它。你应该写一个答案,这样提问的用户可以将其标记为解决方案。剩下的唯一问题是解码后的图像从水平方向旋转90度到垂直方向。“我也能解决这个问题吗?”eeschimosu Done-转化为一个答案。就旋转而言。。。。不应该是代码本身的某些东西导致了这种情况。我在我的答案中添加了一些代码作为一个用例。这非常有效。唯一的问题是编码和解码需要花费大量时间并冻结应用程序。Firebase使用异步调用,因此在写入或读取数据期间不应冻结应用程序。也就是说,在我的示例代码中,imageRef.setValue可能应该在一个块中完成,以便您知道它何时完成了写入周期。另一方面,读取和解码已经在一个块中,因此它应该只在从Firebase返回数据时进行解码。有了结构合理的代码,它只会在准备好的时候编码/解码,所以冻结应该不是问题。也许另一个问题和一些示例代码是合适的?嗨,迈克。我正在使用Firebase。如何从projects Firebase存储桶中获取图像并将其显示在UIImageView中?请注意,我通过Firebase控制台手动上传了所有图像。谢谢@brkr,您将创建对它的引用(在控制台的文件查看器中,当您单击图像时,您将在侧面板中看到一个URL,它有一个gs://bucket/path/to/your/image URL),然后您可以使用它下载数据。查看下载文档了解更多信息:真棒!您认为为用户端保存图像的最佳方式是什么?我正在用200种不同类型的枪/枪皮制作一个游戏。对于新用户,他们所有的枪都将使用默认占位符锁定。但当他们解锁时,我需要更新显示的图像和数据。我应该保存到内存还是本地?这些图像很小,每个都有70KB。有几种方法可以做到这一点:1)将它们保存在资源包中(如果你同意在应用程序中提供200*70KB=14MB的内容,这很好),2)将它们存储在静态资产服务中,如Firebase Hosting(文件将是公共的),或3)将它们存储在Firebase存储中。对于2和3,您可以使用类似SDWebImage的东西来执行下载和使用占位符,这里的区别是成本和安全性(您是否关心所有文件都是公共的),而1是下载大小的折衷。
// Upload data
let uploadTask = storageRef.putData(...)
// Add a progress observer to an upload task
uploadTask.observeStatus(.Progress) { snapshot in
// Upload reported progress
if let progress = snapshot.progress {
let percentComplete = 100.0 * Double(progress.completedUnitCount) / Double(progress.totalUnitCount)
}
}