2017-09-12 73 views
2

我想使用GPUImage将图像转换成灰度。我写了一个扩展名来完成我的工作。灰度的事情没关系。但是输出图像的尺寸已经增加了一倍。在我的情况下,我需要的图像是在确切的大小。有人可以帮助我吗?任何帮助将不胜感激。GPUImage使图像大小增加一倍 - iOS/Swift

这是我写的

import UIKit 
import GPUImage 

extension UIImage { 

    public func grayscale() -> UIImage?{ 

     var processedImage = self 

     print("1: "+"\(processedImage.size)") 

     let image = GPUImagePicture(image: processedImage) 

     let grayFilter = GPUImageGrayscaleFilter() 
     image?.addTarget(grayFilter) 

     grayFilter.useNextFrameForImageCapture() 
     image?.processImage() 
     processedImage = grayFilter.imageFromCurrentFramebuffer() 

     print("2: "+"\(processedImage.size)") 

     return processedImage 
    } 

} 

扩展这是在控制台

enter image description here

编辑输出:我知道图像以后可以调整大小。但需要知道为什么会发生这种情况,并且有什么可以保持图像大小,因为它使用GPUImage。

+0

看到你的内存大小也增加 –

+0

@JitendraModi是的,进程使用将近100 Mb的内存 – GMHSJ

+1

检查原始图像的“缩放”。任何你使用scale'2'图像的机会,并且GPUImage在相同像素尺寸下给你一个比例尺为'1'的图像? –

回答

1

尝试图像后规模:

if let cgImage = processedImage.cgImage { 
    //The scale value 2.0 here should be replaced by the original image's scale. 
    let scaledImage = UIImage(cgImage: cgImage, scale: 2.0, orientation: processedImage.imageOrientation) 
    return scaledImage 
} 
+0

我知道它可以调整大小。但我需要一个完美的解决方案,而不是调整大小。 – GMHSJ

+0

正如@Kevin Ballard所说,GPUImage给出的比例尺为1.因此,如果原始比例尺不是1,您需要更改比例尺。请检查原始比例尺并将其应用到我的答案中的方法中。否则,你需要更改GPUImage的源代码来做同样的事情,我不认为这是一个好的选择。我的答案不是调整大小,而是创建一个具有良好比例值的新图像。 –

+0

哎呀,对不起。这不是调整大小,是的。你是对的。在调用此扩展方法之前,我调整了原始图像的大小。在那里,我已经将比例设置为2.由于GPUImage输出比例为1的图像,因此最终图像的尺寸变成了双倍。这就是原因。谢谢你,朋友。 – GMHSJ

0

我不知道GPUImage库是如何转换为灰度图像。我猜他们的实施扩大了形象。您可以将其缩小自己或替代,我建议转换图像通过使用下面的代码为灰度自己

extension UIImage { 
    func grayscale() -> UIImage { 

     let filter = CIFilter(name: "CIPhotoEffectMono") 

     // convert UIImage to CIImage and set as input 

     let ciInput = CIImage(image: self) 
     filter?.setValue(ciInput, forKey: "inputImage") 

     // get output CIImage, render as CGImage first to retain proper UIImage scale 

     let ciOutput = filter?.outputImage 
     let ciContext = CIContext() 
     let cgImage = ciContext.createCGImage(ciOutput!, from: (ciOutput?.extent)!) 

     return UIImage(cgImage: cgImage!) 
    } 
} 

来源:https://stackoverflow.com/a/40181589/7842542

+0

我知道如何使用CoreImage过滤器来做到这一点。但在我的情况下,我应该使用GPUImage。多数民众赞成:( – GMHSJ

+0

然后,你将不得不挖掘你正在使用的图书馆,并试图了解究竟是什么导致图像缩放...或图书馆可能有一些属性或方法,你可以使用没有因为它不是你的代码,而是一个第三方库,可以扩展图像,所以我会说最好的地方是Github页面 – Malik

+0

感谢你帮助我的朋友,我的问题几乎解决了。不是GPUImage的问题,这是错误的缩放。 – GMHSJ