autojs长宽不定的图片在正方形图片居中实现详解

目录
  • 正文
  • 思路整理
  • 计算缩放系数
  • 缩放图片
  • 绘制图片时左上角坐标
  • 绘制图片
    • 第二种方法
    • 第三种方法

正文

图片的长宽不是固定的,

正方形图片的长宽是固定的, 比如512x512

思路整理

图片肯定是要缩放的, 我要需要一个缩放系数;

图片肯定是要有位置的, 因此, 我们需要一个坐标;

我们一共需要两样东西

  • 缩放系数
  • 绘制图片时, 左上角坐标

计算缩放系数

"nodejs";
const { readImage } = require("image");
async function main() {
  let squareImg = await readImage("square.png");
  let rectangleImg = await readImage("rectangle.png");
  let squareWidth = squareImg.width; // 512
  let squareHeight = squareImg.height; // 512
  let rectangleWidth = rectangleImg.width; // 900
  let rectangleHeight = rectangleImg.height; // 300
  var scale = Math.min(squareWidth / rectangleWidth, squareWidth / rectangleHeight);
  console.log(scale); // 0.5688888888888889
}
main();

900 × 0.5688888888888889 = 512

缩放图片

  let scaledRectangleImg = await rectangleImg.scale(scaleValue);
  console.log(scaledRectangleImg);

打印的图片数据

Image {
  _onRecycledCallbacks: [],
  _mat: Mat {
    __nativeObject: '-5476376627956078312',
    step: 2048,
    elemSize: 4,
    sizes: [ 171, 512 ],
    empty: 0,
    depth: 0,
    dims: 2,
    channels: 4,
    type: 24,
    cols: 512,
    rows: 171
  }
}

有一个sizes字段

sizes: [ 171, 512 ]

表示这个mat的高和宽,

mat的高, 对应的是 rows 字段, row表示行, 多个行摞起来就表示高;

mat的宽, 对应的是 cols 字段, col表示, 多个列排起来就表示宽;

绘制图片时左上角坐标

我们先来看Y坐标,

这是一个蓝色背景的正方形,

还有一个缩放后的绿色长方形

这个Y坐标应该是多少呢?

在绿色下方, 是剩余的蓝色,

假设我们的绿色长方形移动后的位置是红色

这个移动的距离怎么算呢?

移动的距离 = 正方形图片高度的一半 - 长方形高度的一半

X的坐标同理

移动的距离 = 正方形图片宽度的一半 - 长方形宽度的一半

移动的距离 = 512/2 - 512/2 = 0

绘制图片

用canvas绘制图片, 这里的图片要用Image转成Bitmap, 因为canvas支持 Bitmap, 不支持 Image

let squareBitmap = squareImg.toBitmap();
let scaledRectangleBitmap = scaledRectangleImg.toBitmap();
let canvas = new Canvas(squareBitmap);
let x = (squareWidth - scaledRectangleBitmap.getWidth()) / 2;
let y = (squareHeight - scaledRectangleBitmap.getHeight()) / 2;
canvas.drawBitmap(scaledRectangleBitmap, x, y, null);
let drawingImg = Image.ofBitmap(squareBitmap);
let tempImgPath = path.join(process.cwd(), "temp.png");
await writeImage(drawingImg, tempImgPath);
app.viewFile(tempImgPath);

图片不用了, 就要回收

  squareImg.recycle();
  rectangleImg.recycle();
  scaledRectangleImg.recycle();
  drawingImg.recycle();
  squareBitmap.recycle();
  scaledRectangleBitmap.recycle();

第二种方法

用 Matrix

"nodejs";
require("rhino").install();
const { readImage, writeImage, Image } = require("image");
const path = require("path");
const app = require("app");
const Matrix = android.graphics.Matrix;
const Canvas = android.graphics.Canvas;
async function main() {
  let squareImg = await readImage("square.png");
  let rectangleImg = await readImage("rectangle.png");
  let squareWidth = squareImg.width; // 512
  let squareHeight = squareImg.height; // 512
  let rectangleWidth = rectangleImg.width; // 900
  let rectangleHeight = rectangleImg.height; // 300
  var scaleValue = Math.min(squareWidth / rectangleWidth, squareWidth / rectangleHeight);
  let squareBitmap = squareImg.toBitmap();
  let rectangleBitmap = rectangleImg.toBitmap();
  let canvas = new Canvas(squareBitmap);
  let matrix = new Matrix();
  matrix.postTranslate(-rectangleWidth / 2, -rectangleHeight / 2);
  matrix.postScale(scaleValue, scaleValue);
  matrix.postTranslate(squareWidth / 2, squareHeight / 2);
  canvas.drawBitmap(rectangleBitmap, matrix, null);
  let drawingImg = Image.ofBitmap(squareBitmap);
  let tempImgPath = path.join(process.cwd(), "temp.png");
  await writeImage(drawingImg, tempImgPath);
  app.viewFile(tempImgPath);
  squareImg.recycle();
  rectangleImg.recycle();
  drawingImg.recycle();
  squareBitmap.recycle();
}
main();

Matrix 的缩放和平移的顺序可以换换

  matrix.postScale(scaleValue, scaleValue);
  matrix.postTranslate(squareWidth / 2, squareHeight / 2);
  matrix.postTranslate((-rectangleWidth * scaleValue) / 2, (-rectangleHeight * scaleValue) / 2);

或者

  matrix.postTranslate(-rectangleWidth / 2, -rectangleHeight / 2);
  matrix.postTranslate(squareWidth / 2, squareHeight / 2);
  matrix.postScale(scaleValue, scaleValue, squareWidth / 2, squareHeight / 2);

理解Matrix的时候, 脑子里要有参考系坐标轴,

要是在电脑上画出来就更好了, 电脑可以任意缩放和移动物体

第三种方法

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

"nodejs";
require("rhino").install();
const { readImage, writeImage, Image } = require("image");
const path = require("path");
const app = require("app");
const Canvas = android.graphics.Canvas;
const Rect = android.graphics.Rect;
async function main() {
  let squareImg = await readImage("square.png");
  let rectangleImg = await readImage("rectangle.png");
  let squareWidth = squareImg.width; // 512
  let squareHeight = squareImg.height; // 512
  let rectangleWidth = rectangleImg.width; // 900
  let rectangleHeight = rectangleImg.height; // 300
  var scaleValue = Math.min(squareWidth / rectangleWidth, squareWidth / rectangleHeight);
  let squareBitmap = squareImg.toBitmap();
  let rectangleBitmap = rectangleImg.toBitmap();
  let canvas = new Canvas(squareBitmap);
  let src = new Rect(0, 0, rectangleWidth, rectangleHeight);
  let dst = new Rect(
    (squareWidth - rectangleWidth * scaleValue) / 2,
    (squareHeight - rectangleHeight * scaleValue) / 2,
    (squareWidth + rectangleWidth * scaleValue) / 2,
    (squareHeight + rectangleHeight * scaleValue) / 2
  );
  canvas.drawBitmap(rectangleBitmap, src, dst, null);
  let drawingImg = Image.ofBitmap(squareBitmap);
  let tempImgPath = path.join(process.cwd(), "temp.png");
  await writeImage(drawingImg, tempImgPath);
  app.viewFile(tempImgPath);
  squareImg.recycle();
  rectangleImg.recycle();
  drawingImg.recycle();
  squareBitmap.recycle();
}
main();

环境

设备: 小米11pro
Android版本: 12
Autojs版本: 9.3.11

名人名言

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

声明

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

以上就是autojs长宽不定的图片在正方形图片居中实现详解的详细内容,更多关于autojs长宽不定图片居中的资料请关注我们其它相关文章!

(0)

相关推荐

  • autojs模仿QQ长按弹窗菜单实现示例

    目录 分析弹框菜单 需求分析 代码分析 RecyclerView基础代码 长按事件 环境 分析弹框菜单 圆角 列表, 类似grid 箭头位于文字中间上(下)方 需求分析 如果要写一个这样的教程, 我们需要做什么 写一个列表, 用来触发长按选项 写一个弹窗菜单 代码分析 列表怎么写, 先来一个最简单的布局代码 "nodejs ui"; require("rhino").install(); const ui = require("ui"); cla

  • autojs模仿QQ长按弹窗菜单实现示例详解二

    目录 引言 弹窗菜单 箭头 如何确认箭头方向? 调整popwindow的位置 调用方法如下 绘制箭头 修改颜色和圆角 给弹框菜单添加点击事件 弹框菜单点击事件引用弹框实例 环境 引言 上一节讲了列表和长按事件 autojs模仿QQ长按弹窗菜单 弹窗菜单 由粗到细, 自顶向下的写代码 我们现在要修改的文件是showMenuWindow.js function showMenuWindow(view) { let popMenuWindow = ui.inflateXml( view.getCont

  • autojs绘画实现六边形示例详解

    目录 界面基础代码 创建Hexagon类 界面布局 画板事件 计算并绘制六边形中心点 计算六边形六个点的坐标 计算六边形的path 绘制六边形 绘制一排六边形 确定边界条件 考虑两个相邻的六边形连接处 限制一排六边形最后一个的边界 画第二排六边形 绘制多排六边形 先画一组 一组一组的计算坐标 环境 界面基础代码 "nodejs ui"; require("rhino").install(); const ui = require("ui"); c

  • autojs的Node.js正确退出脚本示例

    目录 正文 写界面的格式 脚本退出但是可能会发生异常报错 正文 写界面的格式 class MainActivity extends ui.Activity { ... } 比如我们在界面里面加了个按钮, 点击按钮之后就退出脚本 btn.setOnClickListener(function () { process.exit(0) }); 脚本退出但是可能会发生异常报错 那么正确的姿势是什么呢? 沿用安卓额方法, 要退出脚本的时候, 这样写 // this指向的是org.autojs.autoj

  • autojs长宽不定的图片在正方形图片居中实现详解

    目录 正文 思路整理 计算缩放系数 缩放图片 绘制图片时左上角坐标 绘制图片 第二种方法 第三种方法 正文 图片的长宽不是固定的, 正方形图片的长宽是固定的, 比如512x512 思路整理 图片肯定是要缩放的, 我要需要一个缩放系数; 图片肯定是要有位置的, 因此, 我们需要一个坐标; 我们一共需要两样东西 缩放系数 绘制图片时, 左上角坐标 计算缩放系数 "nodejs"; const { readImage } = require("image"); async

  • 微信小程序图片自适应支持多图实例详解

    微信小程序图片自适应支持多图实例详解 微信小程序图片自适应,是一个比较常见的需求,平时我们在WEBView中,只需要设置max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应. 首先我们来看看图片组件给的一些说明: 属性名 类型 默认值 说明 src String 图片资源地址 mode String 'scaleToFill' 图片裁剪.缩放的模式 binderror HandleE

  • GoJs 图片绘图模板Picture使用示例详解

    目录 前言 go.Picture的使用 go.Picture的属性 width.height.desiredSize属性 source属性 flip属性 imageStretch.imageAlignment属性 拓展 结语 前言 前面已经说过了通过go.TextBlock(文本)和go.Shape(集合图形)来丰富节点内部的显示内容.而有些时候需要在节点内部上传一些说明材料,恰好这些材料又是图片材料.如果拿图片和节点信息对照观看的话,一一对照会特别麻烦.如果能够在节点内部显示缩略图的话.在信息

  • 使用python flask框架开发图片上传接口的案例详解

    python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片. 目录结构: app.py编辑内容: from flask import Flask, request, Response, render_template from werkzeug.utils import secure_filename import os import uuid from PIL import Image, ExifTags app =

  • 前端JS图片懒加载原理方案详解

    目录 背景 原理 方案 方案一:img的loading属性设为“lazy” 使用方法 优点 兼容性 缺点 方案二:通过offsetTop来计算是否在可视区域内 优化 优点 缺点 方案三:通过getBoundingClientRect来计算是否在可视区域内 方案四:使用IntersectionObserver来判断是否在可视区域内 兼容性 优点 缺点 问题 布局抖动 响应式图片 SEO不友好 插件 背景 懒加载经常出现在前端面试中,是前端性能优化的常用技巧.懒加载也叫延迟加载,把非关键资源先不加载

  • jQuery图片缩放插件smartZoom使用实例详解

    e-smart-zoom-jquery.js插件,下载地址及示例:https://github.com/e-smartdev/smartJQueryZoom 插件描述:通过将鼠标悬停在图片上,滚动鼠标滚轮即可实现图片的放大或者缩小效果. smartZoom使用 举个栗子,上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <tit

  • IOS图片的原生(Graphics)详解及实例

    IOS图片的原生(Graphics)详解及实例 一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController @end RootViewController.m #import "RootViewController.h" @interface RootViewController () @end @imple

  • jQuery的图片轮播插件PgwSlideshow使用详解

    0 PgwSlideshow简介 PgwSlideshow是一款基于Jquery的图片轮播插件,基本布局分为上下结构,上方为大图轮播区域,用户可自定义图片轮播切换的间隔时间,也可以通过单击左右方向按键实现图片切换:下方为要轮播的所有图片的缩略图展示,可直接单击缩略图快速切换图片. PgwSlideshow主要有以下特点: •体验度很好的响应式设计 •支持桌面及移动设备 •身形矫健,压缩后的文件只有不到4KB •你可以自定义或者直接修改基本的css样式来给你想要的轮播插件美个容 PgwSlides

  • spring boot 图片上传与显示功能实例详解

    首先描述一下问题,spring boot 使用的是内嵌的tomcat, 所以不清楚文件上传到哪里去了, 而且spring boot 把静态的文件全部在启动的时候都会加载到classpath的目录下的,所以上传的文件不知相对于应用目录在哪,也不知怎么写访问路径合适,对于新手的自己真的一头雾水. 后面想起了官方的例子,没想到一开始被自己找到的官方例子,后面太依赖百度谷歌了,结果发现只有官方的例子能帮上忙,而且帮上大忙,直接上密码的代码 package hello; import static org

  • 基于Vue实现图片在指定区域内移动的思路详解

    当图片比要显示的区域大时,需要将多余的部分隐藏掉,我们可以通过绝对定位来实现,并通过动态修改图片的left值和top值从而实现图片的移动.具体实现效果如下图,如果我们移动的是div 实现思路相仿. 此处需要注意的是 我们在移动图片时,需要通过draggable="false" 将图片的 <img src="/static/pano-dev/test/image-2.jpg" draggable="false" />,否则按下鼠标监听o

随机推荐