4

嗨,有什么方法可以在 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;

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

UIImage *stretchImage = [image stretchableImageWithLeftCapWidth:10 topCapHeight:10];

有谁能够帮助我?我没有找到任何可以为我提供这种功能的框架或 SDK。我已经用谷歌搜索了很长时间。

4

1 回答 1

7

碰巧的是,我正在做的事情几乎和你现在为我们公司描述的一样。我们正在处理面孔,这是一个更容易现实地解决的问题。

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

邓肯马克杯之前

这是一个“胖脸”的转变:

邓肯马克杯之后

我所做的是将图像导入 OpenGL 纹理,然后将该纹理应用于网格。我对网格应用了一组更改,将某些点挤压得更近,而将其他点拉得更远。获得逼真的胖脸需要大量微调,但我认为效果相当不错。

一旦我计算出网格,OpenGL 就会“繁重”地转换图像,而且速度非常快。一切都设置好后,实际上绘制转换后的图像是一个调用。

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

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

我花了几个星期的全职工作来完成基本的网格变形工作(对于一个失败的客户项目),然后又花了一周左右的时间来对胖脸布局进行微调。将整个东西变成可销售的产品仍然是一项正在进行的工作。

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

为了进行这种图像处理,您需要了解三角、代数、指针数学、转换矩阵,并对如何编写高度优化的代码有扎实的了解。

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

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

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

于 2012-05-16T02:54:58.457 回答