注册

国庆渐变头像

国庆五星红旗渐变色头像

五星红旗半透明头像教程

国旗渐变头像

国庆头像 国旗渐变 制作设置教程

此生不悔入华夏 祝祖国繁荣昌盛!

效果展示

01.jpg02.jpg03.jpg04.jpg05.jpg06.jpg07.jpg08.jpg09.jpg10.jpg11.jpg12.jpg13.jpg14.jpg15.jpg

缘起

群聊的时候, 有人说这个国旗渐变的效果, 我看了一下, 有点帅呢, 就研究了一下

环境

雷电模拟器: 4.0.63 Android版本: 7.1.2 Autojs版本: 8.8.20

思路

  1. 准备国旗和头像
  2. 国旗修改透明渐变
  3. 合并两张图片

你将学到以下知识点

  • 判断图片类型, 如果用户传入了jpg, 就把他变成png
  • 修改图片大小, 把国旗和头像宽高改为一致
  • 修改图片为透明渐变
  • 保存mat为文件
  • byte数组转为16进制字符串
  • mat转bitmap
  • 打印mat的属性
  • 合并图片

代码讲解

1. 国旗渐变我做成了模块, 方便调用
let formatImg = require("./formatImg");

let dir = files.path("./img");
var arr = files.listDir(dir);
let filePathList = arr.map((item) => {
return files.join(dir, item);
});

filePathList.map((filePath) => {
formatImg(filePath);
});
2. 导入类
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(org.opencv.android.Utils);
importClass(android.graphics.Bitmap);
importClass(java.lang.StringBuilder);
importClass(java.io.FileInputStream);
importClass(java.io.File);
3. 定义图片类型, 用于判断图片类型
const TYPE_JPG = "jpg";
const TYPE_GIF = "gif";
const TYPE_PNG = "png";
const TYPE_BMP = "bmp";
const TYPE_UNKNOWN = "unknown";
4. 归一化图片, 都改为png格式
function formatImg(imgPath) {
let type = getPicType(new FileInputStream(new File(files.path(imgPath))));
if (type === "png") {
return imgPath;
} else if (type === "jpg") {
var img = images.read(imgPath);
images.save(img, "/sdcard/tempImg001.png");
return "/sdcard/tempImg001.png";
} else {
toastLog("只支持jpg或者png");
return false;
}
}
5. 读取图片
var img = images.read(imgPath);
var img2 = images.read(imgPath2);
6. 修改图片大小
function normalize(img, img2) {
let imgWidth = img.getWidth(); // 200
let imgHeight = img.getHeight(); // 200
return images.resize(img2, [imgWidth, imgHeight]);
}
7. 修改图片透明渐变
function transparentGradient(mat) {
let width = mat.width();
let height = mat.height();
let unit = 256 / width;
let wLimit = (width / 5) * 3;
for (var i = 0; i < height; i++) {
for (var j = 0; j < width; j++) {
let item = mat.get(i, j);
if (j > wLimit) {
item[3] = 0;
} else {
item[3] = 180 - unit * j;
}
mat.put(i, j, item);
}
}
return mat;
}
8. 合并图片
let img4 = merge(mat, mat3);
9. 预览效果
let tempDir = files.join("/sdcard/Pictures/img");
let tempFilePath2 = files.join(tempDir, files.getName(oImgPath2));
files.createWithDirs(tempFilePath2);
images.save(img4, tempFilePath2);
app.viewFile("/sdcard/1.png");
10. 释放资源
img.recycle();
img2.recycle();
img3.recycle();
img4.recycle();
mat.release();
mat3.release();

名人名言

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


0 个评论

要回复文章请先登录注册