- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在从字符串生成条形码,然后尝试将此图像保存到 iPhone 照片库。这是我的代码:
@IBOutlet weak var uuidLabel: UILabel!
@IBOutlet weak var barcodeDisplay: UIImageView!
@IBAction func generateBarcode(_ sender: Any) {
barcodeDisplay.image = generateBarcodeFromString(string: uuidLabel.text!)
UIImageWriteToSavedPhotosAlbum(barcodeDisplay.image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}
@objc func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
if let error = error {
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let ac = UIAlertController(title: "Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}
func generateBarcodeFromString(string:String)->UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CICode128BarcodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 1, y: 1)
if let output = filter.outputImage?.transformed(by: transform) {
return UIImage(ciImage: output)
}
}
return nil
}
当我运行这个应用程序时,它会生成条形码并显示在 View Controller 上。当我尝试将此图像保存到 iPhone 照片库时,选择器显示“您的图像已保存到您的照片中。”但图像未保存到 iPhone 照片库中。
之后,当我尝试通过以下方式将此图像转换为 NSData 时:
let data = UIImagePNGRepresentation(barcodeDisplay.image!) as NSData?
它返回零。这背后的问题是什么?
最佳答案
Swift version: 5.2
问题是QRCode是CIImage所以我们需要把它转换成UIImage才能保存到相册
QRCodeGenerator.swift
import UIKit
final class QrCodeGenerator {
func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 5, y: 5) // Scale according to imgView
if let output = filter.outputImage?.transformed(by: transform) {
return convert(output)
}
}
return nil
}
private func convert(_ cmage:CIImage) -> UIImage? {
let context:CIContext = CIContext(options: nil)
guard let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent) else { return nil }
let image:UIImage = UIImage(cgImage: cgImage)
return image
}
}
ImageSaver.swift
import UIKit
final class ImageSaver: NSObject {
func writeToPhotoAlbum(image: UIImage) {
UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveError), nil)
}
@objc func saveError(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
if let error = error {
print("error: \(error.localizedDescription)")
} else {
print("Save completed!")
}
}
}
QrCodeViewController
import UIKit
class QrCodeViewController: UIViewController {
@IBOutlet weak var qrCodeImageView: UIImageView!
private let qrCodeGenerator = QrCodeGenerator()
private let imageSaver = ImageSaver()
init() {
super.init(nibName: "QrCodeViewController", bundle: nil)
}
required init?(coder _: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save Photo", style: .plain, target: self, action: #selector(addTapped))
guard let image = qrCodeGenerator.generateQRCode(from: "mock") else { return }
qrCodeImageView.image = image
}
@objc func addTapped() {
guard let inputImage = QrCodeGenerator().generateQRCode(from: "mock") else { assertionFailure("null image"); return }
imageSaver.writeToPhotoAlbum(image: inputImage)
}
}
为了让应用程序能够将照片写入(添加)到设备照片库中,我们必须将 NSPhotoLibraryAddUsageDescription
添加到应用程序的 plist 文件中:
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Our application needs permission to write photos...</string>
关于ios - UIImageWriteToSavedPhotosAlbum 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48535524/
我想用下面的void API把抓拍到的图片写入相册,但是有2个参数不是很清楚 UIImageWriteToSavedPhotosAlbum ( UIImage *image, id
下面的代码将我从应用程序中拍摄的图像保存到相机胶卷中。我试图弄清楚如何将首次启动相机时显示在拍摄图像按钮旁边的左角的缩略图更新为我保存的图像。它不应该总是添加到相机胶卷中的最后一张图像吗?这是我保存它
我正在尝试拍摄应用程序当前 View 的屏幕截图并将其保存到相册(然后通过电子邮件或彩信发送)。 UIGraphicsBeginImageContext(self.view.bounds.size);
我正在尝试将 ImageView 中当前的图像保存到相机胶卷中。我尝试保存的图像通过 [mainImage setImage:outputImage]; 完美显示在 ImageView 中; 但是,当
我正在尝试将裁剪的图像保存到相机胶卷中。 (我需要以编程方式进行操作,我无法让用户对其进行编辑) 这是我(仍然很基本)的剪切并保存代码: - (void)cutAndSaveImage:(UIImag
我想在 iOS 10 中创建并保存 UIImage。我可以通过拍摄 UIView 快照或使用 UIGraphicsImageRenderer 创建它( 如下所示)。 - (UIView *)creat
我正在尝试从 GLKView 获取屏幕截图并将其保存到照片库。不幸的是,保存的照片质量很低,我不知道为什么。 这是使用 ImageView 类显示在屏幕上的 UIImage 的链接:https://w
我目前认识到的第一个函数调用 UIImageWriteToSavedPhotosAlbum 阻塞主线程大约 1.5 秒,即使在 iphone 4s/ipad2 上也是如此。 我也试过像这样将它保
我想在 iOS 10 中创建并保存一个 UIImage。我可以通过拍摄 UIView 快照或使用 UIGraphicsImageRenderer 创建它( 如下所示)。 - (UIView *)cre
我正在运行代码 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 将照片(来自 URL 的图像)保存到相册库。这非常有效。但是,这是一个盲函数,
我可以调用 UIImageWriteToSavedPhotosAlbum 并毫无问题地处理完成: class A { func saveNow() { UIImageWrite
我正在从字符串生成条形码,然后尝试将此图像保存到 iPhone 照片库。这是我的代码: @IBOutlet weak var uuidLabel: UILabel! @IBOutlet weak va
努力让 UIImageWriteToSavedPhotosAlbum 快速工作 https://developer.apple.com/library/ios/documentation/UIKit/
好吧,我已经搜索遍了,但似乎找不到我需要的答案。 :-( 这是我正在做的事情以及我需要发生的事情。我有一个 UIImageView,我可以使用 UIPanGestureRecognizer、UIRot
用户使用相机拍摄照片后,我尝试使用按钮将照片保存到相机胶卷中,但我不知道为什么我的照片没有保存在照片库中! 这是我的代码: -(IBAction)savePhoto{ UIImageWrite
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我有一个正在使用的应用 UIImageWriteToSavedPhotosAlbum(img, self, "image:didFinishSavingWithError:contextInfo:",
我正在尝试使用 UIImageWriteToSavedPhotosAlbum() 函数捕获并保存图片。这是我现在的代码。 @IBAction func CameraAction(sender:
我在 UIImagePickerController 类中使用 UIImageWriteToSavedPhotosAlbum 方法来保存使用我的应用程序拍摄的照片。它工作正常,但问题是每张保存的照片需
我使用 GPUImage2( https://github.com/BradLarson/GPUImage2 ) 编写了代码。 我确认我的代码在触摸设置按钮(渲染过滤后的图像)之前成功保存了图像。 但
我是一名优秀的程序员,十分优秀!