You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用开发:如何将设备图库图片转为简笔画?

Android图片转简易线稿的可行方案

以下是几种落地性强的实现方案,适配Android平台:

一、原生Bitmap+RenderScript实现基础线稿

利用Android原生RenderScript加速图像处理,结合边缘检测算法快速生成线稿:

  1. 步骤拆解:
    • 将图库获取的Bitmap转为灰度图
    • 使用RenderScript内置的边缘检测工具提取线条
    • 对结果做二值化处理,强化黑白对比
  2. 核心代码示例:
    // 初始化RenderScript
    val rs = RenderScript.create(context)
    val inputBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true)
    
    // 创建边缘检测脚本
    val edgeDetect = ScriptIntrinsicEdgeDetect.create(rs, Element.U8_4(rs))
    val inputAlloc = Allocation.createFromBitmap(rs, inputBitmap)
    val outputAlloc = Allocation.createTyped(rs, inputAlloc.type)
    
    edgeDetect.setInput(inputAlloc)
    edgeDetect.forEach(outputAlloc)
    outputAlloc.copyTo(inputBitmap)
    
    // 二值化调整(自定义阈值控制线条深浅)
    for (x in 0 until inputBitmap.width) {
        for (y in 0 until inputBitmap.height) {
            val pixel = inputBitmap.getPixel(x, y)
            val grayValue = Color.red(pixel)
            inputBitmap.setPixel(x, y, if (grayValue > 60) Color.WHITE else Color.BLACK)
        }
    }
    rs.destroy()
    // inputBitmap即为生成的线稿
    

二、集成OpenCV for Android实现高精度线稿

OpenCV提供成熟的计算机视觉工具链,能灵活调整线稿的精细度:

  1. 集成依赖:在app模块的build.gradle中添加:
    implementation 'org.opencv:opencv-android:4.8.0'
    
  2. 核心代码示例:
    // 初始化OpenCV(建议在Application中完成)
    if (!OpenCVLoader.initDebug()) {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_4_8_0, context, null)
    }
    
    // 处理图片
    val mat = Mat()
    Utils.bitmapToMat(originalBitmap, mat)
    // 转灰度图
    Imgproc.cvtColor(mat, mat, Imgproc.COLOR_BGR2GRAY)
    // 高斯模糊降噪
    Imgproc.GaussianBlur(mat, mat, Size(3.0, 3.0), 0.0)
    // Canny边缘检测(调整高低阈值控制线条密度)
    Imgproc.Canny(mat, mat, 45.0, 135.0)
    // 反转颜色实现白底黑线
    Core.bitwise_not(mat, mat)
    // 转回Bitmap
    Utils.matToBitmap(mat, lineArtBitmap)
    mat.release()
    

三、轻量级ML模型生成风格化线稿

如果需要更接近示例图的手绘风格,可以使用TensorFlow Lite预训练模型:

  1. 准备模型:将量化后的轻量级线稿生成模型放入assets目录(比如基于U-Net的简化版)
  2. 核心代码示例:
    // 加载TFLite模型
    val interpreter = TensorFlowLite.newInstance(context, "line_art_model.tflite")
    // 预处理:缩放图片至模型输入尺寸、归一化
    val inputSize = 256
    val resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, inputSize, inputSize, true)
    val inputBuffer = TensorBuffer.createFixedSize(intArrayOf(1, inputSize, inputSize, 3), DataType.FLOAT32)
    inputBuffer.loadBitmap(resizedBitmap)
    // 运行推理
    val outputBuffer = TensorBuffer.createFixedSize(intArrayOf(1, inputSize, inputSize, 1), DataType.FLOAT32)
    interpreter.run(inputBuffer.buffer, outputBuffer.buffer)
    // 后处理:转回Bitmap并缩放至原尺寸
    val outputBitmap = Bitmap.createBitmap(inputSize, inputSize, Bitmap.Config.ARGB_8888)
    outputBuffer.loadBitmap(outputBitmap)
    val finalBitmap = Bitmap.createScaledBitmap(outputBitmap, originalBitmap.width, originalBitmap.height, true)
    interpreter.close()
    

注意事项

  • 处理大尺寸图片时,建议先缩放再处理,避免内存溢出
  • 边缘检测的阈值、模糊参数需根据实际图片类型调整,适配不同场景
  • ML模型方案优先选择量化后的轻量模型,控制APK体积

内容的提问来源于stack exchange,提问作者i_am_somebody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:47:53