首页 > 解决方案 > 无法对具有不同高度和宽度的位图进行样式化

问题描述

我在代码实验室中使用 Google 提供的 Tensorflow 模型之一在图像上应用艺术风格。

我正在使用以下代码来应用样式:

  private fun stylizeImage(bitmap: Bitmap) {
    val intValues = IntArray(desiredWidth * desiredHeight)
    val floatValues = FloatArray(desiredWidth * desiredHeight* 3)

    bitmap.getPixels(intValues, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)

    for (i in 0 until intValues.size) {
        val value = intValues[i]
        floatValues[i * 3] = ((value shr 16) and 0xFF) / 255.0f
        floatValues[i * 3 + 1] = ((value shr 8) and 0xFF) / 255.0f
        floatValues[i * 3 + 2] = (value and 0xFF) / 255.0f
    }
    // Copy the input data into TensorFlow.
    inferenceInterface.feed(INPUT_NODE, floatValues, 1, bitmap.width.toLong(), bitmap.height.toLong(), 3)
    inferenceInterface.feed(STYLE_NODE, styleVals, NUM_STYLES.toLong())

    // Execute the output node's dependency sub-graph.
    inferenceInterface.run(arrayOf(OUTPUT_NODE), false)

    // Copy the data from TensorFlow back into our array.
    inferenceInterface.fetch(OUTPUT_NODE, floatValues)

    for (i in 0 until intValues.size) {
        intValues[i] = (0xFF000000.toInt()
                or ((floatValues[i * 3] * 255).toInt() shl 16)
                or ((floatValues[i * 3 + 1] * 255).toInt() shl 8)
                or (floatValues[i * 3 + 2] * 255).toInt())
    }

    val newBm = Bitmap.createBitmap(intValues, bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
    imageView.setImageBitmap(newBm)
}

desiredWidth问题是如果和的尺寸desiredHeight相同(方形图像),上述代码可以正常工作。如果尺寸不同(矩形图像),则输出图像与预期不符,并且某些图案会重复,如下所示。 在此处输入图像描述

任何帮助将不胜感激。谢谢。

标签: androidtensorflowandroid-bitmaptensorflow-lite

解决方案


您是否尝试过 getScaleType() 来返回图像缩放类型? https://developer.android.com/reference/android/widget/ImageView


推荐阅读