因此,我一直在开发一个小的“绘图”应用程序,用户可以在其中将图像绘制到网格画布上(基本上是创建像素图)。我想创建一个导出画布的函数(将其视为UIColor
的数组,然后将其转换为RawPixel
,这是我需要的简单颜色容器,因为实际的RGB值需要成为UInt8
,因此我可以将其保存到CGImage中。
到目前为止,一切都很好。我想做的就是让用户可以选择将当前图形作为图像保存到“照片”中。这就是问题的开始。这是在屏幕上绘制的图像:
https://github.com/metosin/compojure-api/wiki/Middleware
但是当我导出它时,这就是图像的样子……超级模糊且非常微小。现在,有了我可以使用的微小功能,但是我不知道该如何解决。
我实际上已经将生成的CGImage
放在UIImageView
中,并设置了imgViewQR.layer.magnificationFilter = kCAFilterNearest
,然后看起来非常清晰。但是我希望在将图形保存到“照片”应用中时保留这种特殊行为。我真的不知道在哪里搜索,所以将不胜感激!
这是我用来加载具有相关颜色的“画布”以及将其保存到照片的方法。
var rawPixelArray = [RawPixel]()
guard let canvasColorArray = self.canvasView?.canvas.getPixelColorArray(),
let canvasWidth = self.canvasView?.canvas.getAmountOfPixelsForWidth(),
let canvasHeight = self.canvasView?.canvas.getAmountofPixelsForHeight() else {
return
}
canvasColorArray.forEach { (color) in
let rawPixel = RawPixel(inputColor: color)
rawPixelArray.append(rawPixel)
}
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
var data = rawPixelArray
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
guard let dataProvider = CGDataProvider(data: NSData(bytes: &data,
length: data.count * MemoryLayout<RawPixel>.size)
) else { return }
guard let exportedCGImage = CGImage.init(width: canvasWidth, height: canvasHeight, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: canvasWidth * (MemoryLayout<RawPixel>.size), space: rgbColorSpace, bitmapInfo: bitmapInfo, provider: dataProvider, decode: nil, shouldInterpolate: false, intent: .defaultIntent) else {
print("CGImage could not be created.")
return
}
let exportedUIImage = UIImage(cgImage: exportedCGImage)
let imageView = UIImageView(image: exportedUIImage)
UIImageWriteToSavedPhotosAlbum(imageView.image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
答案 0 :(得分:0)
好吧,所以最后我找到了一个解决方案(这有点像hack,但是它可以工作,并且现在在像素边缘方面一切都非常清晰,而且您实际上可以将其导出为任何实际大小您想要的图片!):
let exportedUIImage = UIImage(cgImage: exportedCGImage)
let imageView = UIImageView(image: exportedUIImage)
imageView.layer.magnificationFilter = kCAFilterNearest
imageView.frame = CGRect(x: 5, y: 5, width: yourDesiredWidth, height: yourDesiredHeight)
//just remember to yourDesiredWidth and yourDesiredHeight according to your actual drawing width/drawing height.
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, imageView.isOpaque, 0.0)
imageView.drawHierarchy(in: imageView.bounds, afterScreenUpdates: true)
let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
所以我要做的是,基本上创建一个(不可见的)UIImageView,将magnificationFilter
更改为kCAFilterNearest
,这将生成清晰,清晰的图像,然后只需对其进行屏幕截图并将其保存到“照片”中