mirror of
https://github.com/Hopiu/fabric.js.git
synced 2026-05-16 01:33:09 +00:00
parent
702126eb85
commit
5db01369e4
1 changed files with 57 additions and 30 deletions
|
|
@ -90,61 +90,70 @@
|
|||
/**
|
||||
* Filter sliceByTwo
|
||||
* @param {Object} canvasEl Canvas element to apply filter to
|
||||
* @param {Number} width
|
||||
* @param {Number} height
|
||||
* @param {Number} newWidth
|
||||
* @param {Number} newHeight
|
||||
* @param {Number} oW Original Width
|
||||
* @param {Number} oH Original Height
|
||||
* @param {Number} dW Destination Width
|
||||
* @param {Number} dH Destination Height
|
||||
* @returns {ImageData}
|
||||
*/
|
||||
sliceByTwo: function(canvasEl, width, height, newWidth, newHeight) {
|
||||
sliceByTwo: function(canvasEl, oW, oH, dW, dH) {
|
||||
var context = canvasEl.getContext('2d'), imageData,
|
||||
multW = 0.5, multH = 0.5, signW = 1, signH = 1,
|
||||
doneW = false, doneH = false, stepW = width, stepH = height,
|
||||
doneW = false, doneH = false, stepW = oW, stepH = oH,
|
||||
tmpCanvas = fabric.util.createCanvasElement(),
|
||||
tmpCtx = tmpCanvas.getContext('2d');
|
||||
newWidth = floor(newWidth);
|
||||
newHeight = floor(newHeight);
|
||||
tmpCanvas.width = max(newWidth, width);
|
||||
tmpCanvas.height = max(newHeight, height);
|
||||
dW = floor(dW);
|
||||
dH = floor(dH);
|
||||
tmpCanvas.width = max(dW, oW);
|
||||
tmpCanvas.height = max(dH, oH);
|
||||
|
||||
if (newWidth > width) {
|
||||
if (dW > oW) {
|
||||
multW = 2;
|
||||
signW = -1;
|
||||
}
|
||||
if (newHeight > height) {
|
||||
if (dH > oH) {
|
||||
multH = 2;
|
||||
signH = -1;
|
||||
}
|
||||
imageData = context.getImageData(0, 0, width, height);
|
||||
canvasEl.width = max(newWidth, width);
|
||||
canvasEl.height = max(newHeight, height);
|
||||
imageData = context.getImageData(0, 0, oW, oH);
|
||||
canvasEl.width = max(dW, oW);
|
||||
canvasEl.height = max(dH, oH);
|
||||
context.putImageData(imageData, 0, 0);
|
||||
|
||||
while (!doneW || !doneH) {
|
||||
width = stepW;
|
||||
height = stepH;
|
||||
if (newWidth * signW < floor(stepW * multW * signW)) {
|
||||
oW = stepW;
|
||||
oH = stepH;
|
||||
if (dW * signW < floor(stepW * multW * signW)) {
|
||||
stepW = floor(stepW * multW);
|
||||
}
|
||||
else {
|
||||
stepW = newWidth;
|
||||
stepW = dW;
|
||||
doneW = true;
|
||||
}
|
||||
if (newHeight * signH < floor(stepH * multH * signH)) {
|
||||
if (dH * signH < floor(stepH * multH * signH)) {
|
||||
stepH = floor(stepH * multH);
|
||||
}
|
||||
else {
|
||||
stepH = newHeight;
|
||||
stepH = dH;
|
||||
doneH = true;
|
||||
}
|
||||
imageData = context.getImageData(0, 0, width, height);
|
||||
imageData = context.getImageData(0, 0, oW, oH);
|
||||
tmpCtx.putImageData(imageData, 0, 0);
|
||||
context.clearRect(0, 0, stepW, stepH);
|
||||
context.drawImage(tmpCanvas, 0, 0, width, height, 0, 0, stepW, stepH);
|
||||
context.drawImage(tmpCanvas, 0, 0, oW, oH, 0, 0, stepW, stepH);
|
||||
}
|
||||
return context.getImageData(0, 0, newWidth, newHeight);
|
||||
return context.getImageData(0, 0, dW, dH);
|
||||
},
|
||||
|
||||
/**
|
||||
* Filter lanczosResize
|
||||
* @param {Object} canvasEl Canvas element to apply filter to
|
||||
* @param {Number} oW Original Width
|
||||
* @param {Number} oH Original Height
|
||||
* @param {Number} dW Destination Width
|
||||
* @param {Number} dH Destination Height
|
||||
* @returns {ImageData}
|
||||
*/
|
||||
lanczosResize: function(canvasEl, oW, oH, dW, dH) {
|
||||
|
||||
function lanczosCreate(lobes) {
|
||||
|
|
@ -226,20 +235,29 @@
|
|||
return process(0);
|
||||
},
|
||||
|
||||
bilinearFiltering: function(canvasEl, w, h, w2, h2) {
|
||||
/**
|
||||
* bilinearFiltering
|
||||
* @param {Object} canvasEl Canvas element to apply filter to
|
||||
* @param {Number} oW Original Width
|
||||
* @param {Number} oH Original Height
|
||||
* @param {Number} dW Destination Width
|
||||
* @param {Number} dH Destination Height
|
||||
* @returns {ImageData}
|
||||
*/
|
||||
bilinearFiltering: function(canvasEl, oW, oH, dW, dH) {
|
||||
var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,
|
||||
color, offset = 0, origPix, ratioX = this.rcpScaleX,
|
||||
ratioY = this.rcpScaleY, context = canvasEl.getContext('2d'),
|
||||
w4 = 4 * (w - 1), img = context.getImageData(0, 0, w, h),
|
||||
pixels = img.data, destImage = context.getImageData(0, 0, w2, h2),
|
||||
w4 = 4 * (oW - 1), img = context.getImageData(0, 0, oW, oH),
|
||||
pixels = img.data, destImage = context.getImageData(0, 0, dW, dH),
|
||||
destPixels = destImage.data;
|
||||
for (i = 0; i < h2; i++) {
|
||||
for (j = 0; j < w2; j++) {
|
||||
for (i = 0; i < dH; i++) {
|
||||
for (j = 0; j < dW; j++) {
|
||||
x = floor(ratioX * j);
|
||||
y = floor(ratioY * i);
|
||||
xDiff = ratioX * j - x;
|
||||
yDiff = ratioY * i - y;
|
||||
origPix = 4 * (y * w + x);
|
||||
origPix = 4 * (y * oW + x);
|
||||
|
||||
for (chnl = 0; chnl < 4; chnl++) {
|
||||
a = pixels[origPix + chnl];
|
||||
|
|
@ -255,6 +273,15 @@
|
|||
return destImage;
|
||||
},
|
||||
|
||||
/**
|
||||
* hermiteFastResize
|
||||
* @param {Object} canvasEl Canvas element to apply filter to
|
||||
* @param {Number} oW Original Width
|
||||
* @param {Number} oH Original Height
|
||||
* @param {Number} dW Destination Width
|
||||
* @param {Number} dH Destination Height
|
||||
* @returns {ImageData}
|
||||
*/
|
||||
hermiteFastResize: function(canvasEl, oW, oH, dW, dH) {
|
||||
var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,
|
||||
ratioWHalf = ceil(ratioW / 2),
|
||||
|
|
|
|||
Loading…
Reference in a new issue