मैंने एक ऐसे मुद्दे पर भाग लिया है जहां मैंने सीआईएममेज => यूआईएममेज से छवियों को परिवर्तित कर दिया है और रंग रूपांतरण में कहीं विकृत हो जाते हैं।

मैंने जो परीक्षण केस स्थापित किया है वह एक शुद्ध नीली छवि है जिसे मैं सीआईएममेज और पथ के यूआरएल के साथ खोलता हूं। मैं इसे यूआईएममेज में परिवर्तित करता हूं जो मैंने सोचा था कि सीआईएममेज को यूआईएममेज में परिवर्तित करने का सुंदर मानक तरीका था, यानी सीआईसीएन्टेक्स्ट: createCGImage, फिर पिक्सल में से एक को जांचें।

अपेक्षित होना:

pixelColor :: rgba : 0.0 : 0.0 : 1.0 : 1.0 

वास्तविक:

pixelColor :: rgba : 0.0 : 0.1803921568627451 : 1.0 : 1.0 

वैसे भी, अगर कोई यह बता सकता है कि ऐसा क्यों हो रहा है, तो मैं इसकी सराहना करता हूं। धन्यवाद।

guard let path = Bundle.main.path(forResource: "Blue", ofType: "png") else { // RGBA 0, 0, 255, 0
  debugPrint("File :: Blue not found")
  return
}
let url = URL(fileURLWithPath: path)

if let ciImage = CIImage(contentsOf: url) {
  let converted = convert(ciImage: ciImage)
  let _ = converted.getPixelColor(pos: pixelPoint)
}

--

func convert(ciImage:CIImage) -> UIImage
{
    let context:CIContext = CIContext.init(options: nil)
    let cgImage:CGImage = context.createCGImage(ciImage, from: ciImage.extent)!
    let image:UIImage = UIImage.init(cgImage: cgImage)
    return image
}

--

extension UIImage {
    func getPixelColor(pos: CGPoint) -> UIColor {

    let pixelData = self.cgImage!.dataProvider!.data
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

    let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

    let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
    let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
    let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
    let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

    print("pixelColor :: rgba : \(r) : \(g) : \(b) : \(a)")

    return UIColor(red: r, green: g, blue: b, alpha: a)
}
0
Will Chen 18 सितंबर 2020, 00:04

1 उत्तर

सबसे बढ़िया उत्तर

तो मेरा कन्वर्ट फ़ंक्शन CIContext को सही ढंग से प्रारंभ नहीं कर रहा था। यहाँ सही तरीका है:

  func convert(ciImage:CIImage) -> UIImage?
  {
    let context = CIContext(options: [CIContextOption.workingColorSpace: kCFNull!])
    if let cgImage:CGImage = context.createCGImage(ciImage, from: ciImage.extent, format: .RGBA8, colorSpace: CGColorSpace.init(name: CGColorSpace.sRGB)!) {
      let image:UIImage = UIImage.init(cgImage: cgImage)
      return image
    }
    return nil
  }
0
Will Chen 19 सितंबर 2020, 09:54