如何在iPhone SDK中将瘦图像更改为胖图像?

Hru*_*tai 4 iphone image-processing

嗨,有没有办法在iPhone SDK中将图像瘦身尺寸改为脂肪尺寸,反之亦然?有点像这个图像

在这个应用程序中,我想让用户通过滑动他可以在iPhone SDK中测量其大小的滑块,将其图像从常规大小更改为胖大小?我认为这可以通过获取图像像素我已经尝试过此代码来获取图像像素,但它只是从图像中删除颜色.

UIImage *image      = [UIImage imageNamed:@"foo.png"];

CGImageRef imageRef = image.CGImage;
NSData *data        = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
char *pixels        = (char *)[data bytes];

// this is where you manipulate the individual pixels
// assumes a 4 byte pixel consisting of rgb and alpha
// for PNGs without transparency use i+=3 and remove int a
for(int i = 0; i < [data length]; i += 4)
{
    int r = i;
    int g = i+1;
    int b = i+2;
    int a = i+3;

    pixels[r]   = pixels[r]; // eg. remove red
    pixels[g]   = pixels[g];
    pixels[b]   = pixels[b];
    pixels[a]   = pixels[a];
}

// create a new image from the modified pixel data
size_t width                    = CGImageGetWidth(imageRef);
size_t height                   = CGImageGetHeight(imageRef);
size_t bitsPerComponent         = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel             = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow              = CGImageGetBytesPerRow(imageRef);

CGColorSpaceRef colorspace      = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo         = CGImageGetBitmapInfo(imageRef);
CGDataProviderRef provider      = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);

CGImageRef newImageRef = CGImageCreate (
  width,
  height,
  bitsPerComponent,
  bitsPerPixel,
  bytesPerRow,
  colorspace,
  bitmapInfo,
  provider,
  NULL,
  false,
  kCGRenderingIntentDefault

  // the modified image
  UIImage *newImage   = [UIImage imageWithCGImage:newImageRef];
  imgView.image = newImage;
Run Code Online (Sandbox Code Playgroud)

我也尝试过从这段代码中拉伸图像.

UIImage *stretchImage = [image stretchableImageWithLeftCapWidth:10 topCapHeight:10];
Run Code Online (Sandbox Code Playgroud)

有谁能够帮我?我没有找到任何给我这种功能的框架或SDK.我用谷歌搜索了很长时间.

Dun*_*n C 7

碰巧的是,我正在研究的东西几乎就像你现在为我们公司描述的那样.我们正在处理面孔,这是一个更容易实现的问题.

这是一张之前的图片(真的是你的)

邓肯杯子之前

这是一个"胖脸"的转变:

Duncan Mug之后

我所做的是将图像导入OpenGL纹理,然后将该纹理应用于网格.我对网格网格应用了一组更改,将某些点挤压在一起并将其他点拉得更远.得到一个逼真的胖脸需要进行大量的微调,但我认为结果非常好.

一旦我计算了网格,OpenGL就可以很快地完成转换图像的"繁重工作".设置完所有内容后,实际绘制转换后的图像只需一次调用.

这是相同的图像,显​​示网格线:

带网格线的胖脸http://imageshack.com/a/img404/8049/afterwithlines.jpg

我花了几个星期的全职工作来完成基本的网格整形工作(对于一个落后的客户端项目),然后又花了一周左右的时间来调整胖脸部布局.将整个产品变成可销售的产品仍然是一项进展中的工作.

我提出的算法足够快,可以将胖转换(以及其他各种方法)应用于iOS摄像头的视频输入,速度为30 FPS.

为了进行这种图像处理,您需要了解trig,代数,指针数学,转换矩阵,并对如何编写高度优化的代码有深刻的理解.

我正在使用Apple的新Core Image人脸识别代码来查找图像中的人物脸部特征,并使用眼睛和嘴巴的坐标作为我的变换的起点.

你的项目更加雄心勃勃.你必须进行一些严肃的图像处理才能找到所有的特征,追踪它们的轮廓,然后弄清楚如何转换图像以获得令人信服的肥胖效果.您需要在精心控制的条件下拍摄,点亮和拍摄的高分辨率源图像,以获得良好的效果.

对于当前iOS设备的计算能力来说,这可能太过分了,而且你需要做出的图像识别来找出身体部位以及如何对它们进行转换将是非常困难的.您可能希望将开源OpenCV项目作为问题的图像识别部分的起点.