autojs模仿抖音logo效果

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


效果展示


为什么做


看到别人的头像是这种风格, 虽然我不会去修改自己的头像,


但是我想知道如何实现这样的效果,


虽然写出来了, 不过我感觉还是不完全像抖音的效果, 可能还缺点啥


环境


手机: Mi 11 Pro


Android版本: 11


Autojs版本: 9.0.10


思路


  1. 抖音的logo看起来像两张图片重叠的效果
  2. 两张图片是透明的
  3. 还加了偏移
  4. 从原图搞两张透明图片, 再叠加


你将学到以下知识点


  • 设置seekbar监听事件
  • 在seekbar监听事件中, img设置图片, 然后回收图片
  • 由于修改图片是耗时操作, 所以要放到多线程中
  • 合并透明图片
  • byte数组转换成16进制字符串
  • 判断图片类型
  • 修改mat各个通道的值
  • mat转bitmap


代码讲解


1. 导入类, 基本只要你在autojs使用opencv就会用到这些类
console.time("导入类");
runtime.images.initOpenCvIfNeeded();
importClass(org.opencv.core.MatOfByte);
importClass(org.opencv.core.Scalar);
importClass(org.opencv.core.Point);
importClass(org.opencv.core.CvType);
importClass(java.util.List);
importClass(java.util.ArrayList);
importClass(java.util.LinkedList);
importClass(org.opencv.imgproc.Imgproc);
importClass(org.opencv.imgcodecs.Imgcodecs);
importClass(org.opencv.core.Core);
importClass(org.opencv.core.Mat);
importClass(org.opencv.core.MatOfDMatch);
importClass(org.opencv.core.MatOfKeyPoint);
importClass(org.opencv.core.MatOfRect);
importClass(org.opencv.core.Size);
importClass(org.opencv.features2d.DescriptorMatcher);
importClass(org.opencv.features2d.Features2d);
importClass(org.opencv.core.MatOfPoint2f);
importClass(android.graphics.Bitmap);
importClass(org.opencv.android.Utils);
importClass(java.lang.StringBuilder);
importClass(java.io.FileInputStream);
importClass(java.io.File);
console.timeEnd("导入类");


2. 界面
ui.layout(
  <vertical>
    <img id="img"></img>
    <text id="info" textSize="22sp" textColor="#fbfbfe" bg="#00afff" w="*" gravity="center">
      牙叔教程
    </text>
    <horizontal margin="8">
      <text>画笔透明度: </text>
      <text id="paintAlphaValue">0</text>
      <seekbar id="paintAlphaSeekbar" margin="9" w="*"></seekbar>
    </horizontal>
    <horizontal margin="8">
      <text>图片透明度: </text>
      <text id="channelAlphaValue">0</text>
      <seekbar id="channelAlphaSeekbar" margin="9" w="*"></seekbar>
    </horizontal>
    <horizontal margin="8">
      <text>图片偏移: </text>
      <text id="offsetValue">0</text>
      <seekbar id="offsetSeekbar" margin="9" w="*"></seekbar>
    </horizontal>
  </vertical>
);


3. 设置监听
ui.channelAlphaValue.setText(String(channelAlpha));
ui.channelAlphaSeekbar.setMax(255);
ui.channelAlphaSeekbar.setProgress(channelAlpha);
ui.channelAlphaSeekbar.setOnSeekBarChangeListener({
  onStopTrackingTouch: function (seekBar) {
    let progress = seekBar.getProgress();
    let lastImg = currentImg;
    ui.channelAlphaValue.setText(String(progress));
    channelAlpha = parseInt(progress);
    ui.post(function () {
      threads.start(function () {
        currentImg = updateImg();
      });
      lastImg.recycle();
    });
  },
});


4. 修改图片
function updateImg() {
  let modifiedMat = modifyChannelValue(mat);
  let modifiedBitmap = mat2bitmap(modifiedMat);
  modifiedMat.release();
  let modifiedMat2 = modifyChannelValue2(mat);
  let modifiedBitmap2 = mat2bitmap(modifiedMat2);
  modifiedMat2.release();
  let newImg = merge(grayBitmap, modifiedBitmap, modifiedBitmap2);
  ui.img.setImageBitmap(newImg.bitmap);
  modifiedBitmap.recycle();
  modifiedBitmap2.recycle();
  return newImg;
}


5. mat转bitmap
function mat2bitmap(mat) {
  let width = mat.width();
  let height = mat.height();
  let bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  Utils.matToBitmap(mat, bitmap);
  return bitmap;
}


6. byte数组转换成16进制字符串
function bytesToHexString(src) {
  let stringBuilder = new StringBuilder();
  if (src == null || src.length <= 0) {
    return null;
  }
  for (let i = 0; i < src.length; i++) {
    let v = src[i] & 0xff;
    let hv = java.lang.Integer.toHexString(v);
    if (hv.length < 2) {
      stringBuilder.append(0);
    }
    stringBuilder.append(hv);
  }
  return stringBuilder.toString();
}


7. 释放资源
events.on("exit", function () {
  ui.post(function () {
    img.recycle();
    grayBitmap.recycle();
    grayImg.recycle();
    currentImg.recycle();
    log("退出回收资源");
  });
});


名人名言


思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
--- 牙叔教程


声明


部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

相关文章
|
数据采集 小程序 Python
搞定短视频!批量下载快手视频(附源码)
相信大家都接触了短视频平台,比如某音、某手等平台,竟然大家都熟悉了,那么今天辰哥分享的技术是:在某手上搜索视频,并实现下载!
1205 0
|
5月前
|
前端开发 小程序
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
423 0
|
6月前
程序技术好文:通过二维码图片识别二维码内容方法
程序技术好文:通过二维码图片识别二维码内容方法
88 0
|
7月前
如何制作一个微信音乐小游戏
如何制作一个微信音乐小游戏
190 0
|
自然语言处理 Python Windows
|
人工智能 API Python
太牛逼了!用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
太牛逼了!用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
太牛逼了!用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
|
缓存 小程序 前端开发
【零基础微信小程序】基于百度大脑人像分割的证件照换底色小程序实战开发
通过小程序配合百度的人体分割接口进行简单的照片渲染,本期做一个小工具,对学生党、工作人员、打印店铺以及涉及到求职简历办公等需求的人员都很有用,这个项目由于一些原因不再做维护了,于是打算出个教程将证件照小程序分享给大家,这里采用百度AI接口是因为现在网上开源的py脚本对边缘计算不是很优秀,会有很多模糊点没办法处理,识别人体的轮廓范围,与背景进行分离,适用于拍照背景替换、照片合成、身体特效等场景。输入正常人像图片,返回分割后的二值结果图、灰度图、透明背景的人像图(png格式);并输出画面中的人数、人体坐标信息,
550 0
【零基础微信小程序】基于百度大脑人像分割的证件照换底色小程序实战开发
|
机器学习/深度学习 人工智能 开发者
尼日利亚学生使用 PAI 打造卡通头像神器|学习笔记
快速学习尼日利亚学生使用 PAI 打造卡通头像神器。
|
移动开发 前端开发 JavaScript
手把手教你撸一个能生成抖音风格动图的gif制作平台
又到了一周一次的周总结, 笔者基于之前的开源项目 blink , 开发了一款能在线配置故障艺术, 并一键生成gif动图的平台, 这里暂时取名为QT. 接下来笔者将复盘一下该可视化平台的实现步骤以及功能点, 让大家都能做自己的Gif动图生成平台. 在线访问地址: 趣图——一款轻量级生成抖音风格动效的在线工具
455 0