摘要:前幾天由于團隊需要,折騰了一下圖像液化的處理過程。現在來整理一下思路,做個記錄。用到公式如下,網上拿來的話不多說,上代碼本來想盡量寫出點逼格。。。后來發現怎么寫也還是幾個搞定,就那樣了。然后再用的把轉換后的輸出到中效果圖如下
前幾天由于團隊需要,折騰了一下圖像液化的處理過程。
現在來整理一下思路,做個記錄。
</>復制代碼
用到公式如下,網上拿來的
</>復制代碼
話不多說,上代碼
本來想盡量寫出點逼格。。。后來發現怎么寫也還是幾個function搞定,就那樣了。
</>復制代碼
(function(global) {
// 計算兩點距離平方
function distanceSqr( x1, y1, x2, y2 ) { return sqr(x1-x2) + sqr(y1-y2); }
// 計算平方
function sqr(x) { return x*x; }
// 遍歷一個指定圓內的所有點
// 通過callback傳入回調方法,回調傳出每一個點的相關信息
function eachCircleDot( imageData, ox, oy, r, callback ) {
var imgWidth = imageData.width,
imgHeight = imageData.height,
data = imageData.data,
left = ox-r,
right = ox+r,
top = oy-r,
bottom = oy+r,
dotRedOffset,dotGreenOffset,dotBlueOffset,alphaOffset;
for( var x = left; x < right; x++ )
for( var y = top; y < bottom; y++ )
if( distanceSqr( x, y, ox, oy ) <= sqr(r) ) {
dotRedOffset = y*imgWidth*4+x*4;
dotGreenOffset = dotRedOffset + 1;
dotBlueOffset = dotGreenOffset + 1;
alphaOffset = dotBlueOffset + 1;
callback(
// 當前點的坐標
{ x:x, y:y },
// 點的RGBA四個分量對應字節的下標
{
r: dotRedOffset,
g: dotGreenOffset,
b: dotBlueOffset,
a: alphaOffset,
},
// 傳進來的ImageData的data部分
data
);
}
}
// 復制一個imageData的data到一個buff里
function copyImageDataBuff( imgData ) {
var data = imgData.data,
imgDataBuff = [];
for( var i in data )
imgDataBuff[i] = data[i];
return imgDataBuff;
}
// 從buff按照指定坐標復制像素點數據到目標imageData里
function moveDot( imgData, dataBuff, x, y, srcX, srcY ) {
var imgWidth = imgData.width,
imgHeight = imgData.height,
data = imgData.data;
x = Math.floor(x);
y = Math.floor(y);
srcX = Math.floor(srcX);
srcY = Math.floor(srcY);
var targetStartOffset = y*imgHeight*4 + x*4,
srcStartOffset = srcY*imgHeight*4 + srcX*4;
for( var i = 0; i < 4; i++ )
data[ targetStartOffset + i ] = dataBuff[ srcStartOffset + i ];
}
// 執行液化過程
// imgData 通過canvas的getImageData方法得到的數據對象
// cx,cy 圓心坐標
// mx,my 移動目標坐標
// r 作用半徑
// strength 力度百分比(1-100)
function liquify( imgData, cx, cy, mx, my, r, strenth ) {
var imgDataBuff = copyImageDataBuff(imgData);
eachCircleDot( imgData, cx, cy, r, function( posi ) {
var tx = posi.x,
ty = posi.y;
var u = transFormula( cx, cy, mx, my, tx, ty, r, strenth );
moveDot( imgData, imgDataBuff, tx, ty, u.x, u.y );
function transFormula( cx, cy, mx, my, tx, ty, r, strenth ) {
strenth = strenth || 100;
var relativity = sqr(r) - distanceSqr( tx, ty, cx, cy );
var distanceMovedSqr = distanceSqr( mx, my, cx, cy );
var rate = sqr( relativity / ( relativity + distanceMovedSqr*(100/strenth) ) );
var ux = tx - rate * (mx-cx),
uy = ty - rate * (my-cy);
return { x:ux, y:uy };
}
});
}
// 掛到全局對象
global.LiquifyFilter = {
liquify: liquify
};
})(window);
</>復制代碼
使用它
先用canvas的
</>復制代碼
getImageData();
方法獲取到要處理圖片的imageData
全局作用域下調用
</>復制代碼
LiquifyFilter.liquify( imageData, 圓心X, 圓心Y, 目標點X, 目標點Y, 作用半徑, [力度百分比] );
完成轉換。
然后再用canvas的
</>復制代碼
puImageData();
把轉換后的imageData輸出到canvas中
</>復制代碼
效果圖如下
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/49538.html
摘要:前幾天由于團隊需要,折騰了一下圖像液化的處理過程。現在來整理一下思路,做個記錄。用到公式如下,網上拿來的話不多說,上代碼本來想盡量寫出點逼格。。。后來發現怎么寫也還是幾個搞定,就那樣了。然后再用的把轉換后的輸出到中效果圖如下 前幾天由于團隊需要,折騰了一下圖像液化的處理過程。 現在來整理一下思路,做個記錄。 用到公式如下,網上拿來的 showImg(https://segm...
摘要:高性能動畫與端場景需要相比,移動端需要考慮的因素也相對復雜,重點考慮流量功耗與流暢度。而在移動端,我們選擇性能更優瀏覽器原生實現方案動畫。然而,動畫在移動多終端設備場景下,相比會面對更多的性能問題,主要體現在動畫的卡頓與閃爍。1.高性能CSS3動畫 與PC端場景需要相比,移動web端需要考慮的因素也相對復雜,重點考慮:流量、功耗與流暢度。在pc端上考慮更多的是流暢度,而mobile web中...
摘要:前言公司最近有一個頁面的功能,比較簡單的一個調查表功能,嵌套在我們微信公眾號里面。同時用到了微信的登錄和分享接口。參考鏈接使用微信接口前端部分我們用微信接口主要是做的登錄和分享功能,首先是上微信公眾平臺上邊看看,把權限搞好之后后端配置。 showImg(https://segmentfault.com/img/bVbrOkH); 前言: 公司最近有一個H5頁面的功能,比較簡單的一個調查...
閱讀 1945·2021-11-22 14:44
閱讀 1679·2021-11-02 14:46
閱讀 3667·2021-10-13 09:40
閱讀 2605·2021-09-07 09:58
閱讀 1613·2021-09-03 10:28
閱讀 1665·2019-08-29 15:30
閱讀 983·2019-08-29 15:28
閱讀 1474·2019-08-26 12:20