Генерираният CGImage винаги е размазан

Така че работя върху малко приложение за „рисуване“, където потребителят може да рисува изображения върху мрежово платно (основно създавайки пикселно изкуство). Исках да създам функция, която експортира това платно (Смятайте, че това е масив от UIColors, който след това конвертирам в RawPixel, прост цветен контейнер, който ми трябва, защото действителните RGB стойности трябва да бъдат UInt8, за да мога да го запазя в CGI изображение).

Дотук добре. Това, което исках да направя, беше да дам на потребителя опцията да запази текущата си рисунка като изображение в Photos. И тук започва въпросът. Това е изображението, което е нарисувано на екрана:

Действителен чертеж

Но когато експортирам това, ето как изглежда изображението... супер размазано и много мъничко. Сега, с мъничкото, с което мога да работя, но размазването не знам как да го коригирам.

въведете описание на изображението тук

Всъщност взех генерираното CGImage и го поставих в UIImageView и зададох imgViewQR.layer.magnificationFilter = kCAFilterNearest и тогава изглеждаше кристално ясно. Но искам това конкретно поведение да продължи, когато запазя чертежа в приложението Снимки. Наистина не знам къде да търся, така че всяка помощ ще бъда много благодарна!!!

Това е методът, който използвам за зареждане на „платното“ със свързаните цветове и как го запазвам в Photos.

    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
Мисля, че трябва да разширите изображението си в нещо като 2x или 3x, когато запазвате.   -  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