iphone - 如何在iPhone SDK中将瘦图变成胖图?

标签 iphone image-processing

嗨,有什么方法可以在 iPhone SDK 中将图像的瘦尺寸更改为胖尺寸,反之亦然吗? some thing like this image

在这个应用程序中,我想为用户提供一种可能性,通过滑动 slider 将其图像从常规尺寸更改为胖尺寸,他可以在 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;

我也尝试过从此代码中拉伸(stretch)图像。

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

有人可以帮我吗?我没有找到任何框架或 SDK 可以为我提供此类功能。我用谷歌搜索了很长时间。

最佳答案

碰巧,我正在做的事情几乎与您现在为我们公司描述的事情完全一样。我们正在处理人脸问题,实际上这是一个更容易解决的问题。

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

Duncan mug before

这是“胖脸”变换:

Duncan Mug after

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

一旦我计算出网格,OpenGL 就会完成图像转换的“繁重工作”,而且速度非常快。一切设置完毕后,实际绘制转换后的图像只需一次调用。

这是同一张图像,显示网格线:

Fat face with grid lines http://imageshack.com/a/img404/8049/afterwithlines.jpg

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

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

为了进行此类图像处理,您需要了解三角函数、代数、指针数学、变换矩阵,并对如何编写高度优化的代码有深入的了解。

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

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

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

关于iphone - 如何在iPhone SDK中将瘦图变成胖图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10186200/

相关文章:

iphone - Android 开发时间与 iPhone 开发时间

image-processing - 从图像处理计算物体位置

python - 在pygame中获取图像单个像素的颜色

ios - Xcode 不允许我拖放按钮

iphone - 在 ios 上通过 Twilio 发送短信?

opencv - 缩小/限制图像调色板的算法

java - 调整某些图像大小时抛出异常 "java.awt.color.CMMException: Invalid image format"...为什么?

java - 在 java 中使用 jMagick 时无法处理大型 pdf 文件(100M 以上)

iphone - map View 显示最近的位置

iphone - [__NSCFDictionary setObject :forKey:]: mutating method sent to immutable object