Сгенерированный CGImage всегда размыт

Итак, я работал над небольшим приложением для «рисования», в котором пользователь может рисовать изображения на сетке холста (в основном создавая пиксельную графику). Я хотел создать функцию, которая экспортирует этот холст (считайте, что это массив UIColor, который я затем конвертирую в RawPixel, простой цветовой контейнер, который мне нужен, потому что фактические значения RGB должны быть UInt8, поэтому я могу сохранить его в CGImage).

Все идет нормально. Я хотел дать пользователю возможность сохранить свой текущий рисунок как изображение в Фото. И вот тут начинается проблема. Это изображение, которое рисуется на экране:

Фактический рисунок

Но когда я экспортирую это, изображение выглядит так... очень размытое и очень маленькое. Теперь, с крошечностью, с которой я могу работать, но с размытостью, которую я не знаю, как исправить.

введите здесь описание изображения

На самом деле я взял сгенерированный 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)

person Misha    schedule 08.08.2018    source источник
comment
Я думаю, вам нужно увеличить изображение примерно в 2 или 3 раза при сохранении.   -  person Cosmos Man    schedule 08.08.2018
comment
Я думаю, что нашел что-то похожее на то, что вы предлагаете! Спасибо, я отвечу на вопрос через минуту.   -  person Misha    schedule 08.08.2018


Ответы (1)


Хорошо, в конце концов я нашел следующее решение (это своего рода хак, но он работает, и теперь все предельно ясно, когда дело доходит до краев пикселей, ПЛЮС, вы можете экспортировать его в любой размер фактического изображения, которое вы хотите !):

    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, который создает четкое, четкое изображение, а затем просто делает его снимок экрана и сохраняет его в Фото.

person Misha    schedule 08.08.2018