How to save PNG file from NSImage (retina issues)

后端 未结 6 976
情话喂你
情话喂你 2020-11-29 01:37

I\'m doing some operations on images and after I\'m done, I want to save the image as PNG on disk. I\'m doing the following:

+ (void)saveImage:(NSImage *)ima         


        
6条回答
  •  情话喂你
    2020-11-29 02:00

    My 2 cents for OS X including write that handles extensions + offscreen image drawing (method 2); one can verify with NSGraphicsContext.currentContextDrawingToScreen()

    func createCGImage() -> CGImage? {
    
        //method 1
        let image = NSImage(size: NSSize(width: bounds.width, height: bounds.height), flipped: true, drawingHandler: { rect in
            self.drawRect(self.bounds)
            return true
        })
        var rect = CGRectMake(0, 0, bounds.size.width, bounds.size.height)
        return image.CGImageForProposedRect(&rect, context: bitmapContext(), hints: nil)
    
    
        //method 2
        if let pdfRep = NSPDFImageRep(data: dataWithPDFInsideRect(bounds)) {
            return pdfRep.CGImageForProposedRect(&rect, context: bitmapContext(), hints: nil)
        }
        return nil
    }
    
    func PDFImageData(filter: QuartzFilter?) -> NSData? {
        return dataWithPDFInsideRect(bounds)
    }
    
    func bitmapContext() -> NSGraphicsContext? {
        var context : NSGraphicsContext? = nil
        if let imageRep =  NSBitmapImageRep(bitmapDataPlanes: nil,
                                            pixelsWide: Int(bounds.size.width),
                                            pixelsHigh: Int(bounds.size.height), bitsPerSample: 8,
                                            samplesPerPixel: 4, hasAlpha: true, isPlanar: false,
                                            colorSpaceName: NSCalibratedRGBColorSpace,
                                            bytesPerRow: Int(bounds.size.width) * 4,
                                            bitsPerPixel: 32) {
            imageRep.size = NSSize(width: bounds.size.width, height: bounds.size.height)
            context = NSGraphicsContext(bitmapImageRep: imageRep)
        }
        return context
    }
    
    func writeImageData(view: MyView, destination: NSURL) {
        if let dest = CGImageDestinationCreateWithURL(destination, imageUTType, 1, nil) {
            let properties  = imageProperties
            let image = view.createCGImage()!
            let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
            dispatch_async(queue) {
                CGImageDestinationAddImage(dest, image, properties)
                CGImageDestinationFinalize(dest)
            }
        }
    }
    

提交回复
热议问题