无法样式化具有不同高度和宽度的位图

时间:2019-06-18 12:19:55

标签: android tensorflow android-bitmap tensorflow-lite

我正在使用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)
}

问题是,如果desiredWidthdesiredHeight的尺寸相同(正方形图像),则上面的代码可以正常工作。如果尺寸不同(矩形图像),则输出图像不符合预期,并且某些图案会重复显示,如下所示。 enter image description here

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

1 个答案:

答案 0 :(得分:0)

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