2012-04-17 64 views
4

嗨,有没有什么办法可以在iPhone SDK中将您的图像缩小变成脂肪大小反之亦然? some thing like this image如何在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。我搜索了很长时间。

+11

我只是LOL'd!从字面上看! – WrightsCS 2012-04-17 06:32:31

+0

+1 @WrightsCS – cfedermann 2012-04-17 06:33:39

+0

这个问题非常好,但我在提供答案之前就像任何笑一样 – Charan 2012-04-17 06:35:13

回答

8

碰巧,我正在做的事与我们公司现在描述的几乎完全相同。我们正在处理面孔,这是一个更现实的问题。

这里是一个前像(你的真正)

Duncan mug before

这里,它是一个 “胖脸” 转型:

Duncan Mug after

我所做的是导入将图像转换为OpenGL纹理,然后将该纹理应用到网格网格。我对网格应用了一系列更改,将某些点更紧密地挤在一起,并将其他点拉近。获得一张现实的胖脸需要进行很多微调,但我认为,结果非常好。

一旦我计算出了网格,OpenGL会完成图像变形的“繁重工作”,并且速度非常快。完成所有设置后,实际绘制转换后的图像是一次调用。

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

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

我花了一对夫妇的全职工作周获得基本的网翘曲工作(对于摔了客户端项目通过),然后再花费一周左右的时间来调整肥胖的脸部布局。将整件事物变成可销售的产品仍然是一项正在进行中的工作。

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

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

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

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

对于当前iOS设备的计算能力来说,这可能太过分了,要想弄清楚身体部位以及如何改变身体部位,需要做的图像识别将会非常困难。您可能想看看开源OpenCV项目作为问题图像识别部分的起点。

+0

谢谢我非常感谢你的工作,我会尽力在你解释这里。我知道这是不可能发布你的示例代码,但我很高兴听到你做了一些很棒的事情。 – 2012-05-16 05:14:15

+0

@DuncanC感谢您的回答,我有同样的问题。我读了你的答案。但如果有任何详细的教程或任何描述你的步骤编码或教程的例子,然后plz告诉我们。 – 2013-05-02 13:17:26

+0

我需要做同样的事情。你能不能请分享示例代码,这样我就可以将它集成到我的项目中。 – 2013-07-17 05:32:36

相关问题