簡體   English   中英

如何轉換UnsafeMutablePointer <UInt8> 在Swift中使用UIImage

[英]How to convert UnsafeMutablePointer<UInt8> to UIImage in Swift

我一直在嘗試從Android發送圖像數據並使用Socket在iOS上接收,但問題是我無法從流中接收的數據中顯示圖像。

這是完整的代碼: -

設置網絡通信

var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                           ip as CFString,
                                           3003,
                                           &readStream,
                                           &writeStream)

        inputStream = readStream!.takeRetainedValue()
        outputStream = writeStream!.takeRetainedValue()
        inputStream.delegate = self
//        outputStream.delegate = self
        inputStream.schedule(in: .current, forMode: RunLoop.Mode.common)
        outputStream.schedule(in: .current, forMode: RunLoop.Mode.common)
        inputStream.open()
        outputStream.open()

通過代表接收數據,如下所示: -

extension ChatRoom: StreamDelegate {
    func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
        switch eventCode {
        case Stream.Event.hasBytesAvailable:
            print("new message received")
            readAvailableBytes(stream: aStream as! InputStream)
        case Stream.Event.endEncountered:
            print("end received")
            stopStreamSession()
        case Stream.Event.errorOccurred:
            print("error occurred")
        case Stream.Event.hasSpaceAvailable:
            print("has space available")
        case Stream.Event.openCompleted:
            print("Stream opened")
        default:
            print("some other event...")
            break
        }
    }
    private func readAvailableBytes(stream: InputStream) {
        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength)
        while stream.hasBytesAvailable {

            let numberOfBytesRead = inputStream.read(buffer, maxLength: maxReadLength)

            if numberOfBytesRead < 0 {
                if let _ = stream.streamError {
                    break
                }
            }

            NSLog("number of bytes read = %i", numberOfBytesRead)

            if numberOfBytesRead > 0 {
            dataOfImage.append(buffer, count: numberOfBytesRead)

            }
        }

    }

}

我一直在嘗試使用UIImage(data:dataOfImage)顯示接收數據的圖像,但它顯示為nil,當我檢查dataOfImage時,它包含從流接收的所有數據。

任何人都可以建議一種方法從UnsafeMutablePointer<UInt8>數據中獲取圖像。

如果有更好的方法通過套接字進行數據傳輸,請做建議..

而不是allocate內存聲明一個容量為maxReadLengthbuffer 變量

並且stream(_:handle:)被多次調用。 您必須檢查read功能的結果

private var dataOfImage = Data()

private func readAvailableBytes(stream: InputStream) {
    var buffer = [UInt8](repeating: 0, count: maxReadLength)
    let bytesRead = inputStream.read(&buffer, maxLength: maxReadLength)
    switch bytesRead {
    case 0: // success, end of file
    case -1: // error
    default: // append data
       dataOfImage.append(contentsOf: buffer)
    }

    NSLog("number of bytes read = %i", bytesRead)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM