最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

autojs長寬不定的圖片在正方形圖片居中實現(xiàn)詳解

 更新時間:2023年01月31日 10:11:54   作者:牙叔教程  
這篇文章主要為大家介紹了autojs長寬不定的圖片在正方形圖片居中實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

圖片的長寬不是固定的,

正方形圖片的長寬是固定的, 比如512x512

思路整理

圖片肯定是要縮放的, 我要需要一個縮放系數(shù);

圖片肯定是要有位置的, 因此, 我們需要一個坐標;

我們一共需要兩樣?xùn)|西

  • 縮放系數(shù)
  • 繪制圖片時, 左上角坐標

計算縮放系數(shù)

"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);

打印的圖片數(shù)據(jù)

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的高, 對應(yīng)的是 rows 字段, row表示行, 多個行摞起來就表示高;

mat的寬, 對應(yīng)的是 cols 字段, col表示, 多個列排起來就表示寬;

繪制圖片時左上角坐標

我們先來看Y坐標,

這是一個藍色背景的正方形,

還有一個縮放后的綠色長方形

這個Y坐標應(yīng)該是多少呢?

在綠色下方, 是剩余的藍色,

假設(shè)我們的綠色長方形移動后的位置是紅色

這個移動的距離怎么算呢?

移動的距離 = 正方形圖片高度的一半 - 長方形高度的一半

X的坐標同理

移動的距離 = 正方形圖片寬度的一半 - 長方形寬度的一半

移動的距離 = 512/2 - 512/2 = 0

繪制圖片

用canvas繪制圖片, 這里的圖片要用Image轉(zhuǎn)成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();

環(huán)境

設(shè)備: 小米11pro
Android版本: 12
Autojs版本: 9.3.11

名人名言

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

聲明

部分內(nèi)容來自網(wǎng)絡(luò) 本教程僅用于學(xué)習(xí), 禁止用于其他用途

以上就是autojs長寬不定的圖片在正方形圖片居中實現(xiàn)詳解的詳細內(nèi)容,更多關(guān)于autojs長寬不定圖片居中的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于JavaScript?中?if包含逗號表達式

    關(guān)于JavaScript?中?if包含逗號表達式

    這篇文章主要介紹了?關(guān)于JavaScript?中?if包含逗號表達式,有時會看到JavaScript中if判斷里包含英文逗號?“,”,這個是其實是逗號表達式。在if條件里,只有最后一個表達式起判斷作用。下面來看看文章的具體介紹吧
    2021-11-11
  • JS觸摸屏網(wǎng)頁版仿app彈窗型滾動列表選擇器/日期選擇器

    JS觸摸屏網(wǎng)頁版仿app彈窗型滾動列表選擇器/日期選擇器

    這篇文章主要介紹了觸摸屏網(wǎng)頁版仿app彈窗型滾動列表選擇器/日期選擇器的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • JS中的every()對空數(shù)組總返回true原理分析

    JS中的every()對空數(shù)組總返回true原理分析

    這篇文章主要為大家介紹了JS中的every()對空數(shù)組總返回true原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 詳解微信小程序入門五: wxml文件引用、模版、生命周期

    詳解微信小程序入門五: wxml文件引用、模版、生命周期

    本篇文章主要介紹了詳解微信小程序入門五: wxml文件引用、模版、生命周期,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • 微信小程序 MINA文件結(jié)構(gòu)

    微信小程序 MINA文件結(jié)構(gòu)

    這篇文章主要介紹了微信小程序 MINA文件結(jié)構(gòu)的相關(guān)資料,這里詳細介紹了微信小程序的文件目錄及文件作用,需要的朋友可以參考下
    2016-10-10
  • 8個JS的reduce使用實例和reduce操作方式

    8個JS的reduce使用實例和reduce操作方式

    reduce方法是JavaScript中一個比較強大的方法,可能在平時開發(fā)中,有人根本沒用過,通過下面的8個例子,學(xué)會reduce的用法以及它的常用場景,需要的朋友可以參考一下
    2021-09-09
  • 項目中使用TypeScript的TodoList實例詳解

    項目中使用TypeScript的TodoList實例詳解

    這篇文章主要為大家介紹了項目中使用TypeScript的TodoList實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • JavaScript原型Prototype詳情

    JavaScript原型Prototype詳情

    這篇文章主要介紹了JavaScript原型Prototype,在JavaScript中,函數(shù)是一個包含屬性和方法的Function類型的對象。而原型(Prototype?)就是Function類型對象的一個屬性。具體內(nèi)容需要的朋友可以參考下面文章的介紹
    2021-12-12
  • Page?Visibility?API?教程示例

    Page?Visibility?API?教程示例

    這篇文章主要為大家介紹了Page?Visibility?API?的教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 一個很簡單的辦法實現(xiàn)TD的加亮效果.

    一個很簡單的辦法實現(xiàn)TD的加亮效果.

    一個很簡單的辦法實現(xiàn)TD的加亮效果....
    2006-06-06

最新評論

清徐县| 宣化县| 广宁县| 辽中县| 黄石市| 吕梁市| 栾川县| 浙江省| 乌鲁木齐市| 札达县| 上杭县| 常宁市| 花莲市| 通辽市| 台中市| 宁波市| 涞源县| 连江县| 垦利县| 巩义市| 渑池县| 信丰县| 万全县| 通渭县| 泸州市| 长宁区| 海晏县| 周口市| 买车| 扎鲁特旗| 玛多县| 大新县| 凤山县| 营口市| 平谷区| 上思县| 周口市| 治多县| 凌海市| 浠水县| 清水县|