Ivan Alek
Ivan Alek

Reputation: 1919

UIImage nonlinear resizing

I have unicolor image and i need to resize some parts from it, with different scale. Desired result is showed at image. I've looked at applying grid mesh in opengles but i could not find some sample code or more detailed tutorial. I've also looked at imgwrap but as far i can see this library requires qt framework. Any ideas, sample code or links for further read will be appreciated, thanks.enter image description here

Upvotes: 9

Views: 1162

Answers (6)

MrTJ
MrTJ

Reputation: 13192

The problem you are facing is called "image warping" in computer graphics. First you have to define some control points in the original image and corresponding points in a sample destination image. Then you have to calculate a dense displacement field (in this application called also wrapping grid) and simple apply this field to the original image.

More practically: your best bet on iOS will be to create a 2D grid of vertices in OpenGL. Map your original image as a texture over this grid and deform the original grid by displacing some of its points. Then you simple take a screenshot of the resulting image with glReadPixels.

I do not know any CIFilter that would implement displacement field mapping of this kind.

UPDATE: I found also an example code that uses 8 control points to morph images with OpenCV. http://engineeering.blogspot.it/2008/07/image-morphing-with-opencv.html

OpenCV has working ports to iOS, so you could simple experiment with the code on the link above also on a target device.

Upvotes: 8

iPatel
iPatel

Reputation: 47069

I am not sure but i Suggest that if you want do this types of work then you need to crop some part for image and applies your resize feature/functionality in this croped part of image and put at position as it is. I just give my opinion not sure that it is true for you or not.

Here also i give you link of Question please read it, It might be helpful in your case:

How to scale only specific parts of image in iPhone app?

Upvotes: 3

Steven McGrath
Steven McGrath

Reputation: 1727

I suggest you check out Brad Larson's GPUImage project on GitHub. Under Visual effects you will find filters such as GPUImageBulgeDistortionFilter, which you should be able to adapt to your needs.

Upvotes: 2

You might want to try this example using thin plate splines and OpenCV. This, in my opinion, is the easiest-to-try solution that is online.

Upvotes: 1

Colin Cornaby
Colin Cornaby

Reputation: 746

You'll probably want to look at OpenGL shaders. What I'd do is I'd load the image in as a texture, apply a fragment shader (which is a small program that will let you alter distort the image), render the results back to a texture, and either display that texture or save it as a bitmap.

It's not going to be simple, but there is some sample code out there for other distortions. Here's a swirl in shaders: http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl/

I don't think there is an easier way to do this without involving OpenGL, and you probably wouldn't find great performance in doing this outside of the GPU either.

Upvotes: 1

Bersaelor
Bersaelor

Reputation: 2577

A few ideas:

  1. Copy parts of the UIImage into different CGContext using CGBitmapContextCreateImage(), copy the parts around, scale individually, put back together.
  2. Use CIFilter effects on parts of your Image, masking the parts you want to scale. (Core Image Programming Guide)

Upvotes: 2

Related Questions