2015-04-23 62 views
0

將Obj-C轉換爲Swift。正如你可以看到我宣稱let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(cvimgRef)),所以我得到它下面的for循環錯誤。二進制運算符'+ ='不能應用於'Int'和'UInt8'類型的操作數。將Obj-C轉換爲Swift。

二元運算符「+ =」不能應用於類型的操作數「詮釋」和「UINT8」

另外,作爲一個小編,我不知道怎麼翻譯,其餘的OBJ-C for循環下面的代碼。這斜線是什麼意思,我該如何處理指針?我不得不說不安全的地方嗎?

// process the frame of video 
    func captureOutput(captureOutput:AVCaptureOutput, didOutputSampleBuffer sampleBuffer:CMSampleBuffer, fromConnection connection:AVCaptureConnection) { 
     // if we're paused don't do anything 
     if currentState == CurrentState.statePaused { 
      // reset our frame counter 
      self.validFrameCounter = 0 

      return 
     } 

    // this is the image buffer 
    var cvimgRef:CVImageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer) 
    // Lock the image buffer 
    CVPixelBufferLockBaseAddress(cvimgRef, 0) 
    // access the data 
    var width: size_t = CVPixelBufferGetWidth(cvimgRef) 
    var height:size_t = CVPixelBufferGetHeight(cvimgRef) 
    // get the raw image bytes 
    let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(cvimgRef)) 
    var bprow: size_t = CVPixelBufferGetBytesPerRow(cvimgRef) 


    var r = 0 
    var g = 0 
    var b = 0 

     for var y = 0; y < height; y++ { 
      for var x = 0; x < width * 4; x += 4 { 
       b += buf[x]; g += buf[x + 1]; r += buf[x + 2] // error 
      } 
      buf += bprow() // error 
     } 

剩餘的Obj-C代碼。

r/=255*(float) (width*height); 
g/=255*(float) (width*height); 
b/=255*(float) (width*height); 
+0

斜線代表師... – Volker

+3

閱讀錯誤信息,並看看您的變量! 'var r = 0'定義一個'Int','buf [x]'是一個'UInt8'。然後閱讀Swift書:*「值永遠不會被隱式轉換爲另一種類型」* ...並且'r/= 255 *(float)(width * height)中的星星''do * not *表示指針:) –

+0

好吧,我會讀它馬丁。但關於沃爾克的分標誌。我顯然認爲是這樣,但後來我認爲這只是別的,因爲你如何在任務操作員之前有一個分標誌?那麼馬丁這句話的意思是'var r/= 255 *(width * height)'?我認爲第一個星號是一個指針。哎呀。在每個作業或分號之後是否加逗號?哦,Swift不需要任何東西? – Edward

回答

3

你有很多類型不匹配的錯誤。

x的類型不應該是UInt8,因爲x要增加直到寬度的值。

for var x:UInt8 = 0; x < width * 4; x += 4 { // error: '<' cannot be applied to operands of type 'UInt8' and 'Int' 

所以修復它象下面這樣:

for var x = 0; x < width * 4; x += 4 { 

遞增指針的地址,你可以使用advancedBy()功能。

buf += bprow(UnsafeMutablePointer(UInt8)) // error: '+=' cannot be applied to operands of type 'UnsafeMutablePointer<UInt8>' and 'size_t' 

象下面這樣:

var pixel = buf.advancedBy(y * bprow) 

而此行,

RGBtoHSV(r, g, b) // error 

有斯威夫特CGFloatFloat不幸之間不存在隱式轉換。所以你應該明確地投到CGFloat

RGBtoHSV(CGFloat(r), g: CGFloat(g), b: CGFloat(b)) 

整個編輯的代碼是在這裏:

func RGBtoHSV(r: CGFloat, g: CGFloat, b: CGFloat) -> (h: CGFloat, s: CGFloat, v: CGFloat) { 
    var h: CGFloat = 0.0 
    var s: CGFloat = 0.0 
    var v: CGFloat = 0.0 
    let col = UIColor(red: r, green: g, blue: b, alpha: 1.0) 
    col.getHue(&h, saturation: &s, brightness: &v, alpha: nil) 
    return (h, s, v) 
} 

// process the frame of video 
func captureOutput(captureOutput:AVCaptureOutput, didOutputSampleBuffer sampleBuffer:CMSampleBuffer, fromConnection connection:AVCaptureConnection) { 
    // if we're paused don't do anything 
    if currentState == CurrentState.statePaused { 
     // reset our frame counter 
     self.validFrameCounter = 0 
     return 
    } 

    // this is the image buffer 
    var cvimgRef = CMSampleBufferGetImageBuffer(sampleBuffer) 
    // Lock the image buffer 
    CVPixelBufferLockBaseAddress(cvimgRef, 0) 
    // access the data 
    var width = CVPixelBufferGetWidth(cvimgRef) 
    var height = CVPixelBufferGetHeight(cvimgRef) 
    // get the raw image bytes 
    let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(cvimgRef)) 
    var bprow = CVPixelBufferGetBytesPerRow(cvimgRef) 

    var r: Float = 0.0 
    var g: Float = 0.0 
    var b: Float = 0.0 

    for var y = 0; y < height; y++ { 
     var pixel = buf.advancedBy(y * bprow) 
     for var x = 0; x < width * 4; x += 4 { // error: '<' cannot be applied to operands of type 'UInt8' and 'Int' 
      b += Float(pixel[x]) 
      g += Float(pixel[x + 1]) 
      r += Float(pixel[x + 2]) 
     } 
    } 
    r /= 255 * Float(width * height) 
    g /= 255 * Float(width * height) 
    b /= 255 * Float(width * height) 

    //} 

    // convert from rgb to hsv colourspace 
    var h: Float = 0.0 
    var s: Float = 0.0 
    var v: Float = 0.0 

    RGBtoHSV(CGFloat(r), g: CGFloat(g), b: CGFloat(b)) // error 
} 
+0

瘋了。非常感謝。我必須改變你的函數調用這個'RGBtoHSV(CGFloat(r),CGFloat(g),CGFloat(b))',因爲我得到了Xcode Fixit錯誤。 – Edward

相關問題