图像到二进制值-像素值

时间:2020-04-16 11:28:41

标签: android swift binary zpl

我需要将图像转换为十六进制值。当我尝试在uiimage上获得特定像素的颜色代码时,我得到了错误的值。在Java中,我使用bitmap.getpixel()方法达到像素颜色,并且获得了255的正确值,但是在迅速返回0的同一图像像素上,您对此有何评论?或是否有将图像转换为十六进制的便捷方法?

Java Code Reference

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)
        }
    }

0 个答案:

没有答案