日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

canva画图 图片居中裁剪_Canvas裁剪图片(截选框可拖拽)

發(fā)布時間:2025/3/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 canva画图 图片居中裁剪_Canvas裁剪图片(截选框可拖拽) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

利用Canvas實現(xiàn)圖片裁剪

效果圖

實現(xiàn)思路

打開圖片并將圖片繪制到canvas中;

利用canvas的drawImage()函數(shù)來裁剪圖片;

將canvas轉(zhuǎn)化為Image即可。

HTML代碼:

截圖

確認截圖

打開

CSS代碼

CSS代碼基本通過javaScript添加

body {

background-color: black;

}

重點JavaScript代碼

變量定義、添加各事件按鈕、容器等:

let originWidth; // 圖片原始寬度

let originHeight; // 圖片原始高度

let container = document.getElementById('container');

let imgDiv = document.getElementById('imgDiv'); // 存放mycanvas

let btnDiv = document.getElementById('btnDiv');

let clipImgDiv = document.getElementById('clipImgDiv'); // 顯示裁剪所獲的圖片

let btn1 = document.getElementById('btn1'); // 截圖按鈕

let btn2 = document.getElementById('btn2'); // 確認截圖按鈕

let btn3 = document.getElementById('btn3'); // 打開文件按鈕

var oRelDiv = document.createElement("div"); // 截圖框

var scaleX = 1;// 圖片寬度縮放比例(當前實際/原始)

var scaleY = 1; // 圖片高度縮放比例(當前實際/原始)

//拖拽與拉伸方法

//拖拽拉伸所需參數(shù)

let params = {

left: 0,

top: 0,

width: 0,

height: 0,

currentX: 0,

currentY: 0,

flag: false,

kind: "drag"

};

// CSS樣式修改

container.style.display = 'flex';

container.style.flexDirection = 'column';

btnDiv.style.marginBottom = '20px';

btnDiv.style.height = '30px';

imgDiv.style.marginBottom = '20px';

// 創(chuàng)建canvas,用于顯示被裁剪圖片

var myCanvas = document.createElement('canvas');

myCanvas.setAttribute('id', 'myCanvas');

myCanvas.style.display = 'block';

/*myCanvas.style.position = 'absolute';*/

myCanvas.width = 600;

myCanvas.height = 600;

myCanvas.style.border = "1px solid #d3d3d3";

myCanvas.innerText = '您的瀏覽器不支持 HTML5 canvas 標簽。';

myCanvas.style.zIndex = 'auto';

var ctx = myCanvas.getContext('2d');

// 被裁剪圖片

var img = new Image();

img.src = './images/IMG_1550.jpg';

img.setAttribute('id', 'img');

img.width = 600;

img.height = 600;

img.onload = function () {

console.log('onload()執(zhí)行...');

ctx.drawImage(img, 0, 0, 600, 600);

originWidth = img.naturalWidth;

originHeight = img.naturalHeight;

console.log('圖片原始寬度=', originWidth);

console.log('圖片原始高度=', originHeight);

};

// 裁剪得到的圖片

let clipImg = new Image();

clipImg.src = '';

clipImg.style.height = '100px';

clipImg.style.width = '100px';

clipImg.alt = '裁剪獲得圖片...';

// input用于打開文件

let fileInput = document.createElement('input');

fileInput.setAttribute('multiple', 'multiple');

fileInput.setAttribute('type', 'file');

fileInput.setAttribute('id', 'fileInput');

/*btnDiv.appendChild(fileInput);*/

imgDiv.appendChild(myCanvas);

/*clipImgDiv.appendChild(clipImg);*/

一些簡單的功能函數(shù)

// 生成本地圖片URL地址

let getObjectURL = function (file) {

let url = null;

if (window.createObjectURL !== undefined) { // basic

url = window.createObjectURL(file);

} else if (window.webkitURL !== undefined) { // webkit or chrome

url = window.webkitURL.createObjectURL(file);

} else if (window.URL !== undefined) { // mozilla(firefox)

url = window.URL.createObjectURL(file);

}

return url;

};

// 獲取指定元素DOM

const ID = function (id) {

return document.getElementById(id);

};

//獲取相關(guān)CSS屬性方法

let getCss = function (o, key) {

return o.currentStyle ? o.currentStyle[key] : document.defaultView.getComputedStyle(o, false)[key];

};

打開本地圖片

可伸縮截圖框?qū)崿F(xiàn)思路:

截圖框由8各控制截圖框大小、位置小div組成,鼠標在選中截圖框后在拖動鼠標的過程中會根據(jù)鼠標位置對截圖框進行實時繪制

// 打開本地圖片

fileInput.addEventListener('change', function () {

console.log('change()執(zhí)行...');

img.src = getObjectURL(this.files[0]);

});

btn3.addEventListener("click", function () {

fileInput.click();

});

截圖選框的繪制、拖動、大小調(diào)整

btn1.addEventListener("click", function () {

var clickFlag = false;

// 獲取canvas中圖片實際大小

var iCurWidth = img.width;

var iCurHeight = img.height;

console.log('圖片當前實際寬度=', iCurWidth);

console.log('圖片當前實際高度=', iCurHeight);

// 可調(diào)整截圖框

oRelDiv.innerHTML = '';

oRelDiv.style.position = "absolute";

oRelDiv.style.width = iCurWidth + "px";

oRelDiv.style.height = iCurHeight + "px";

oRelDiv.style.top = myCanvas.offsetTop + 'px';

console.log('oRelDiv.style.top = ', oRelDiv.style.top);

oRelDiv.id = "cropContainer";

var iOrigWidth = originWidth;

var iOrigHeight = originHeight;

scaleX = iCurWidth / iOrigWidth; // 圖片寬度縮放比例(當前實際/原始)

scaleY = iCurHeight / iOrigHeight; // 圖片高度縮放比例(當前實際/原始)

console.log('圖片橫向(寬度)縮放比=', scaleX);

console.log('圖片縱向(高度)縮放比=', scaleY);

// 將oRelDiv插入到myCanvas前

myCanvas.parentNode.insertBefore(oRelDiv, myCanvas);

//初始化坐標與剪裁高寬

var cropW = 80; //截圖框默認寬度

var cropH = 80; //截圖框默認高度

/*console.log('myCanvas.offsetLeft=', myCanvas.offsetLeft);

console.log('myCanvas.offsetTop=', myCanvas.offsetTop);*/

var posX = myCanvas.width / 2 - cropW / 2; // 截圖框左上角x坐標

var posY = myCanvas.height / 2 - cropH / 2; // 截圖框左上角y坐標

/*console.log('posX=',posX);

console.log('posY=',posY);*/

oRelDiv.innerHTML = '

' +

'

'

'

'

'

'

'

'

'

'

' +

'' +

'' +

'' +

'';

var startDrag = function (point, target, kind) {

//point是拉伸點,target是被拉伸的目標,其高度及位置會發(fā)生改變

//此處的target與上面拖拽的target是同一目標,故其params.left,params.top可以共用,也必須共用

//初始化寬高

params.width = getCss(target, "width");

params.height = getCss(target, "height");

//初始化坐標

if (getCss(target, "left") !== "auto") {

params.left = getCss(target, "left");

}

if (getCss(target, "top") !== "auto") {

params.top = getCss(target, "top");

}

//target是移動對象

point.onmousedown = function (event) {

params.kind = kind;

params.flag = true;

clickFlag = true;

if (!event) {

event = window.event;

}

var e = event;

params.currentX = e.clientX; //鼠標按下時坐標x軸

params.currentY = e.clientY; //鼠標按下時坐標y軸

/*console.log('params.currentX=', params.currentX);

console.log('params.currentY=', params.currentY);*/

//防止IE文字選中,有助于拖拽平滑

point.onselectstart = function () {

return false;

};

document.onmousemove = function (event) {

let e = event ? event : window.event;

clickFlag = false;

if (params.flag) {

var nowX = e.clientX; // 鼠標移動時x坐標

var nowY = e.clientY; // 鼠標移動時y坐標

var disX = nowX - params.currentX; // 鼠標x方向移動距離

var disY = nowY - params.currentY; // 鼠標y方向移動距離

if (params.kind === "n") {

//上拉伸

//高度增加或減小,位置上下移動

target.style.top = parseInt(params.top) + disY + "px";

target.style.height = parseInt(params.height) - disY + "px";

} else if (params.kind === "w") { //左拉伸

target.style.left = parseInt(params.left) + disX + "px";

target.style.width = parseInt(params.width) - disX + "px";

} else if (params.kind === "e") { //右拉伸

target.style.width = parseInt(params.width) + disX + "px";

} else if (params.kind === "s") { //下拉伸

target.style.height = parseInt(params.height) + disY + "px";

} else if (params.kind === "nw") { //左上拉伸

target.style.left = parseInt(params.left) + disX + "px";

target.style.width = parseInt(params.width) - disX + "px";

target.style.top = parseInt(params.top) + disY + "px";

target.style.height = parseInt(params.height) - disY + "px";

} else if (params.kind === "ne") { //右上拉伸

target.style.top = parseInt(params.top) + disY + "px";

target.style.height = parseInt(params.height) - disY + "px";

target.style.width = parseInt(params.width) + disX + "px";

} else if (params.kind === "sw") { //左下拉伸

target.style.left = parseInt(params.left) + disX + "px";

target.style.width = parseInt(params.width) - disX + "px";

target.style.height = parseInt(params.height) + disY + "px";

} else if (params.kind === "se") { //右下拉伸

target.style.width = parseInt(params.width) + disX + "px";

target.style.height = parseInt(params.height) + disY + "px";

} else { //移動

target.style.left = parseInt(params.left) + disX + "px";

target.style.top = parseInt(params.top) + disY + "px";

}

}

document.onmouseup = function () {

params.flag = false;

if (getCss(target, "left") !== "auto") {

params.left = getCss(target, "left");

}

if (getCss(target, "top") !== "auto") {

params.top = getCss(target, "top");

}

params.width = getCss(target, "width");

params.height = getCss(target, "height");

/*console.log('params.width=', params.width);

console.log('params.height', params.width);*/

//給隱藏文本框賦值

posX = parseInt(target.style.left);

posY = parseInt(target.style.top);

cropW = parseInt(target.style.width);

cropH = parseInt(target.style.height);

if (posX < 0) {

posX = 0;

}

if (posY < 0) {

posY = 0;

}

if ((posX + cropW) > iCurWidth) {

cropW = iCurWidth - posX;

}

if ((posY + cropH) > iCurHeight) {

cropH = iCurHeight - posY;

}

//賦值

ID("cropPosX").value = posX;

ID("cropPosY").value = posY;

ID("cropImageWidth").value = parseInt(ID("zxxCropBox").style.width);

ID("cropImageHeight").value = parseInt(ID("zxxCropBox").style.height);

/*console.log('posX=',posX);

console.log('posY=',posY);*/

};

}

};

};

//綁定拖拽

startDrag(ID("zxxDragBg"), ID("zxxCropBox"), "drag");

//綁定拉伸

startDrag(ID("dragLeftTop"), ID("zxxCropBox"), "nw");

startDrag(ID("dragLeftBot"), ID("zxxCropBox"), "sw");

startDrag(ID("dragRightTop"), ID("zxxCropBox"), "ne");

startDrag(ID("dragRightBot"), ID("zxxCropBox"), "se");

startDrag(ID("dragTopCenter"), ID("zxxCropBox"), "n");

startDrag(ID("dragBotCenter"), ID("zxxCropBox"), "s");

startDrag(ID("dragRightCenter"), ID("zxxCropBox"), "e");

startDrag(ID("dragLeftCenter"), ID("zxxCropBox"), "w");

//圖片不能被選中,目的在于使拖拽順滑

ID("myCanvas").onselectstart = function () {

return false;

};

img.onselectstart = function () {

return false;

};

});

所獲截圖繪制

function cropImage(img, cropPosX, cropPosY, width, height) {

/*var cropContainer = ID("cropContainer");

cropContainer.parentNode.removeChild(cropContainer);*/

/*ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);*/

//sx,sy 是相對于圖片的坐標。巨坑

var newCanvas = document.createElement('canvas');

newCanvas.setAttribute('id', 'newCanvas');

newCanvas.width = width * scaleX;

newCanvas.height = height * scaleY;

newCanvas.style.border = "1px solid #d3d3d3";

var newCtx = newCanvas.getContext('2d');

clipImgDiv.appendChild(newCanvas);

newCtx.drawImage(img, cropPosX, cropPosY, width, height, 0, 0, width * scaleX, height * scaleY);

// canvas轉(zhuǎn)化為圖片

var newImage = new Image();

newImage.src = newCanvas.toDataURL("image/png");

newImage.style.marginLeft = '5px';

clipImgDiv.appendChild(newImage);

oRelDiv.innerHTML = '';

}

確認截圖

// 確認截圖

btn2.addEventListener("click", function () {

console.log("clipend......");

var x = document.getElementById("cropPosX").value;

var y = document.getElementById("cropPosY").value;

var w = document.getElementById("cropImageWidth").value;

var h = document.getElementById("cropImageHeight").value;

console.log('cropImage(img,', x, ',', y, ',', parseInt(w), ',', parseInt(h), ')');

cropImage(img, x / scaleX, y / scaleY, parseInt(w) / scaleX, parseInt(h) / scaleY);

});

我是Cloudy,年輕的前端攻城獅一枚,愛專研,愛技術(shù),愛分享。

個人筆記,整理不易,感謝閱讀、點贊和收藏。

文章有任何問題歡迎大家指出,也歡迎大家一起交流前端各種問題!

總結(jié)

以上是生活随笔為你收集整理的canva画图 图片居中裁剪_Canvas裁剪图片(截选框可拖拽)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人v精品蜜桃久一区 | 超碰人人爱 | 国产农村妇女精品一区二区 | 亚洲一区二区精品视频 | av一级在线| 亚洲黄一区| 亚州中文字幕 | 日韩在线激情 | 欧美成人手机在线 | 免费黄色网址在线观看 | 粗大的内捧猛烈进出视频 | 丝袜av在线播放 | 欧美三根一起进三p | 亚洲高清在线播放 | 天天操夜操 | 国产经典一区二区三区 | 亚洲精品乱码久久久久久久久久久久 | 欧美打屁股 | 亚洲成av人影院 | 国产午夜精品理论片 | 免费的毛片视频 | 亚洲黄色三级视频 | 在线免费观看日韩av | 少妇又紧又深又湿又爽视频 | 免费看的毛片 | 欧美在线网 | 亚洲特级黄色片 | 国产视频精品视频 | 欧美成年视频 | 国产成人精品aa毛片 | 日韩免费一区二区三区 | 91网站在线观看视频 | 中国女人性猛交 | 天狂传说之巴啦啦小魔仙 | 97超碰免费 | 男女搞黄网站 | 丁香一区二区 | 中文有码视频 | 国产日产精品一区二区 | 国产精品后入内射日本在线观看 | 午夜黄色福利视频 | 91综合网| 无码日韩精品视频 | 无码人妻精品一区二区蜜桃视频 | 国产视频在线观看一区 | 超碰在97| 中文字幕一区二区三区乱码 | 91在线免费观看网站 | 超碰资源 | 国产高潮国产高潮久久久 | 日韩的一区二区 | 成人玩具h视频 | 国产精选网站 | 男生和女生靠逼视频 | 国产午夜精品一区二区三区欧美 | 免费av地址 | 中国av一区| 探花国产在线 | 伊人精品久久 | 福利视频一区二区 | 土耳其xxxx性hd极品 | 国产亚洲精品熟女国产成人 | 欧美xxxx免费虐 | 超碰福利在线观看 | 叶山小百合av一区二区 | 99在线视频观看 | 黄色国产在线观看 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 日日干夜 | 欧美日韩中出 | 亚洲精品1区 | 成人网在线视频 | 91人人爽| 日韩视频在线视频 | 中国性老太hd大全69 | 天天艹av | 亚洲成人黄色在线 | 久久精选| 草草影院ccyycom | 亚洲色婷婷久久精品av蜜桃 | 天天躁日日躁狠狠躁av麻豆 | 阿v天堂在线| 国产影视一区 | 噜噜噜久久久 | 色综合久久88色综合天天6 | 亚洲黄色免费网站 | 亚洲av无码不卡一区二区三区 | 久久久一区二区三区四区 | 亚洲av综合一区 | 精品在线视频播放 | 久草99| 美女调教视频 | 六月丁香啪啪 | 免费观看日韩av | 中国国产bdsm紧缚捆绑 | 亚洲成人精品av | 黄色av三级 | 久久国产激情 | 欧美不卡在线观看 |