2017-09-12 76 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