Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to skew image like this

I want to skew an image like this what params I need to set for context.setTransform? enter image description here

like image 503
coure2011 Avatar asked May 03 '12 07:05

coure2011


People also ask

Can you skew an image in Photoshop?

Skewing an image in Photoshop is a quick and easy way to fix photos that are not level. All you need to do is select the area that you want to skew, click on “Edit” > “Transform” > “Skew,” and then click and drag one of the corner handles of the rectangle until your image is level.


1 Answers

You cannot achieve this with a single 2D transform.

A 2D transform allows you to skew the image "upwards" or "downwards" by passing the tangent of the skew angle in the second argument to setTransform(), but you want to perform both in a symmetrical manner (resulting in a "nearwards" and/or "farwards" deformation). You need a 3D transform to do that.

However, you can emulate the same result by slicing the image into several horizontal "bands" and applying a different transform when rendering each band. Bands further from the half of the image will be applied stronger skew angles. Something like:

var width = image.width,
    height = image.height,
    context = $("canvas")[0].getContext("2d");
for (var i = 0; i <= height / 2; ++i) {
    context.setTransform(1, -0.4 * i / height, 0, 1, 0, 60);
    context.drawImage(image,
        0, height / 2 - i, width, 2,
        0, height / 2 - i, width, 2);
    context.setTransform(1, 0.4 * i / height, 0, 1, 0, 60);
    context.drawImage(image,
        0, height / 2 + i, width, 2,
        0, height / 2 + i, width, 2);
}

Note the bands are two pixels high instead of one to avoid a moire effect.

You can see the results in this fiddle.

like image 162
Frédéric Hamidi Avatar answered Sep 20 '22 14:09

Frédéric Hamidi