首页 > 解决方案 > 在 Swift 中为图像添加阴影

问题描述

该项目取自 garnele007 的 SwiftOCR。在 Swift 项目中有一个 NSImage (也转换为 .png 用于保存),我想在上面添加一个阴影。存在几个在视图控制器等中添加阴影的示例,但到目前为止,我还没有找到如何使用 Core Graphics/Image 之类的东西添加阴影的示例。我的想象力给了我类似的东西

randomImg.CGAddShadow(阴影:真实,重量:中等)

一些漂浮的指令使用 UIKit,它不适用于这个 MacOS 项目。其他人为了用户的利益添加了一个临时图层,但不保存仍然应用阴影的文件。

目前的代码如下所示:


            let customImage: (String) -> OCRImage = { code in
                let randomImg = randomImage()
                randomImg.lockFocus()

                randomImg.draw(in: CGRect(origin: CGPoint.zero, size: randomImg.size))


                NSString(string: code).draw(in: CGRect(origin: CGPoint(x: 0, y: -15.5 ), size: randomImg.size), withAttributes: randomFontAttributes())

                randomImg.unlockFocus()


                let data = NSBitmapImageRep(data: randomImg.tiffRepresentation!)?.representation(using: .png, properties: [:])

                 return randomImg
            }

最终结果希望是一个修改过的文件,上面有一个可以保存和以后查看的阴影。

感谢您的任何建议

标签: swiftcocoaswiftocr

解决方案


我最终使用的解决方案(随机棕褐色过滤器):


            let context = CIContext()

            // Load originalCIImage with contents of the URL
            var imageURL = Bundle.main.urlForImageResource(NSImage.Name(rawValue: "image.png"))
            var originalCIImage = CIImage(contentsOf: imageURL!)

            // Declare func for filter
            func sepiaFilter(_ input: CIImage, intensity: Double) -> CIImage?
            {
                let sepiaFilter = CIFilter(name:"CISepiaTone")
                sepiaFilter?.setValue(input, forKey: kCIInputImageKey)
                sepiaFilter?.setValue(intensity, forKey: kCIInputIntensityKey)
                return sepiaFilter?.outputImage
            }

            // call the filter func on the image
            let sepiaCIImage = sepiaFilter(originalCIImage!, intensity:0.9)

            // change the image from CIImage type to NSImage type
            let rep = NSCIImageRep(ciImage: sepiaCIImage!)
            let filteredImage = NSImage(size: rep.size)
            filteredImage.addRepresentation(rep)

            // change from NSImage type to .png format
            let filterData = NSBitmapImageRep(data: filteredImage.tiffRepresentation!)?.representation(using: .png, properties: [:])

            // save the png file to the desktop
            do {
                try filterData?.write(to: (FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first?.appendingPathComponent("FILTEREDIMAGE.png"))!)
            }
            catch _ {
                print("Adding filter to picture error")
            }

// END Sepia Filter

推荐阅读