Изображение в двоичное значение - значение пикселя - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужно преобразовать изображение в шестнадцатеричное значение. Когда я пытаюсь получить цветовой код с указанием c пикселей на uiimage, я получаю неправильное значение. В Java я использую bitmap.getpixel() метод для достижения цвета пикселя, и я получаю правильное значение, которое составляет 255, но при быстром же пикселе изображения, возвращающем 0. У вас есть какие-либо комментарии по этому поводу? или есть удобный способ конвертировать изображение в шестнадцатеричное?

Java Код ссылки

private func createPrintableObject (img:UIImage) -> String{
        let sb = StringBuilder()
        let height:Int = Int(img.size.height)
        let width:Int = Int(img.size.width)
        var index = 0
        var rgb:Int,red:Int,green:Int,blue:Int
        var rgbColor:UIColor
        var auxBinaryChar: [Character] = ["0","0","0","0","0","0","0","0"]
        widthBytes = width / 8
        if(width % 8 > 0){
            widthBytes = ((Int)(width/8))+1
        }else{
            widthBytes = width / 8
        }
        self.total = widthBytes * height
        let pixelData = img.cgImage!.dataProvider!.data
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

        for h in 0...height-1 {
            for w in 0...width-1 {
                let value = Int(data[((width * w) + h) * 4])
                //value returns in Java "-1" but In Swift returning "0"
                // JAVA -> rgb = bitmapImage.getPixel(w, h); returning "-1"


                red = (value >> 16) & 0x000000FF
                green = (value >> 8) & 0x000000FF
                blue = (value) & 0x000000FF

                let totalColor = red + green + blue
                var auxChar = "1"
                if(totalColor > self.blackLimit){
                    auxChar = "0"
                }
                auxBinaryChar[index] = auxChar[0]
                index+=1
                if(index == 8 || w == (width-1)){
                    sb.append(self.fourByteBinary(binaryStr: String(auxBinaryChar)))
                    auxBinaryChar = ["0","0","0","0","0","0","0","0"]
                    index = 0
                }
            }
            sb.append("\n")
        }

        return sb.toString()

    }



 private func fourByteBinary(binaryStr:String) -> String{
        var decimal:Int = Int(binaryStr,radix: 2) ?? 0
        if(decimal > 15){
            return String(decimal, radix: 16, uppercase: true)
        }else{
           decimal = Int(String(decimal),radix:16) ?? 0
            return "0" + String(decimal, radix: 16, uppercase: true)
        }
    }
...