Converting Tensor_float32 to Bitmap

I can transform Bitmap to Tensor_float32 with method TensorImageUtils.bitmapToFloat32Tensor() but how can I get a bitmap from the Tensor_float32? Found that solution but it is only for grayscale images: https://itnext.io/converting-pytorch-float-tensor-to-android-rgba-bitmap-with-kotlin-ffd4602a16b6

1 Like

Hi, I have the same problem, did you find a solution?

1 Like

// I faced the same problem, and I found the function itself

TensorImageUtils.bitmapToFloat32Tensor()

tortures the RGB colorspace. You should try to convert yuv to a bitmap and use

TensorImageUtils.bitmapToFloat32Tensor

instead for NOW.

// I modified the code from phillies (up) to get the coloful bitmap. Note that the format of an output tensor is typically NCHW.

// Here’s my function in Kotlin. Hopefully it works in your case:

private fun floatArrayToBitmap(floatArray: FloatArray, width: Int, height: Int) : Bitmap {

        // Create empty bitmap in ARGB format
        val bmp: Bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        val pixels = IntArray(width * height * 4)

        // mapping smallest value to 0 and largest value to 255
        val maxValue = floatArray.max() ?: 1.0f
        val minValue = floatArray.min() ?: -1.0f
        val delta = maxValue-minValue

        // Define if float min..max will be mapped to 0..255 or 255..0
        val conversion = { v: Float -> ((v-minValue)/delta*255.0f).roundToInt()}

        // copy each value from float array to RGB channels
        for (i in 0 until width * height) {
            val r = conversion(floatArray[i])
            val g = conversion(floatArray[i+width*height])
            val b = conversion(floatArray[i+2*width*height])
            pixels[i] = rgb(r, g, b) // you might need to import for rgb()
        }
        bmp.setPixels(pixels, 0, width, 0, 0, width, height)

        return bmp
    }

Hopefully future releases of PyTorch Mobile will fix this bug.

1 Like

Could you provide the code of java?

hello, I have a problem in the same context.
I have an image shape [1,4,480,640], and I want to convert it to a tensor of the same shape.
BUT when I used TensorImageUtils.bitmaptoFloat() it gives me a shape of [1,3,480,640].
any help please with java code.