mad*_*ika 14 iphone ios xcode4.2
我的代码:如何管理不同色调的脸部的RGB值,以及如何应用?这段代码会改变脸部的颜色和头发,但我想1.只是面部除了头发的颜色.
-(void)changeSkinColorValue:(float)value WithImage:(UIImage*)needToModified
{
CGContextRef ctx;
CGImageRef imageRef = needToModified.CGImage;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//unsigned char *rawData = malloc(firstImageV.image.size.height * firstImageV.image.size.width * 10);
CFMutableDataRef m_DataRef = CFDataCreateMutableCopy(0, 0,CGDataProviderCopyData(CGImageGetDataProvider(firstImageV.image.CGImage)));
UInt8 *rawData = (UInt8 *) CFDataGetMutableBytePtr(m_DataRef);
int length = CFDataGetLength(m_DataRef);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * firstImageV.image.size.width;
NSUInteger bitsPerComponent = 8;
CGContextRef context1 = CGBitmapContextCreate(rawData, firstImageV.image.size.width, firstImageV.image.size.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context1, CGRectMake(0, 0, firstImageV.image.size.width, firstImageV.image.size.height), imageRef);
NSLog(@"%d::%d",width,height);
// for(int ii = 0 ; ii < 250 ; ii+=4)
//{
for(int ii = 0 ; ii < length ; ii+=4)
{
//NSLog(@"Raw data %s",rawData);
int R = rawData[ii];
int G = rawData[ii+1];
int B = rawData[ii+2];
// NSLog(@"%d %d %d", R, G, B);
//if( ( (R>60)&&(R<237) ) || ((G>10)&&(G<120))||((B>4) && (B<120)))
// if( ( (R>100)&&(R<186) ) || ((G>56)&&(G<130))||((B>30) && (B<120)))
// if( ( (R>188)&&(R<228) ) || ((G>123)&&(G<163))||((B>85) && (B<125)))
// if( ( (R>95)&&(R<260) ) || ((G>40)&&(G<210))||((B>20) && (B<170)))
//new code......
if( ( (R>0)&&(R<260) ) || ((G>0)&&(G<210))||((B>0) && (B<170)))
{
rawData[ii+1]=R;//13;
rawData[ii+2]=G;//43;
rawData[ii+3]=value;//63
}
}
ctx = CGBitmapContextCreate(rawData,
CGImageGetWidth( imageRef ),
CGImageGetHeight( imageRef ),
8,
CGImageGetBytesPerRow( imageRef ),
CGImageGetColorSpace( imageRef ),
kCGImageAlphaPremultipliedLast );
imageRef = CGBitmapContextCreateImage(ctx);
UIImage* rawImage = [UIImage imageWithCGImage:imageRef];
//UIImageView *ty=[[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 400, 400)];
//ty.image=rawImage;
//[self.view addSubview:ty];
[secondImageV setImage:rawImage];
CGContextRelease(context1);
CGContextRelease(ctx);
free(rawData);
}
Run Code Online (Sandbox Code Playgroud)
快速的答案是更改您的 OR:
if( ( (R>0)&&(R<260) ) || ((G>0)&&(G<210)) || ((B>0) && (B<170)))
Run Code Online (Sandbox Code Playgroud)
至 AND:
if( ( (R>0)&&(R<260) ) && ((G>0)&&(G<210)) && ((B>0) && (B<170)))
Run Code Online (Sandbox Code Playgroud)
然后调整 RGB 范围以近似图像中的肤色范围(尝试在 UI 中使用一些滑块)。
顺便说一句,我想你知道这一点:
rawData[ii+1]=R;//13;
rawData[ii+2]=G;//43;
rawData[ii+3]=value;//63
Run Code Online (Sandbox Code Playgroud)
将红色通道分配给绿色通道,将绿色通道分配给蓝色通道,然后value分配给 ALPHA 通道。我不认为这是你想要的。
此外,您的needToModified图像可能旨在与 相同的图像firstImageV.image,这不会像现在一样反映在您的代码中。
仅当您识别的颜色范围完全且仅存在于图像的肤色区域时,此方法才有效。
一个长答案可以考虑更复杂的颜色范围选择、选择图像区域的替代方法、CIFilteropenCV 框架的使用......
| 归档时间: |
|
| 查看次数: |
2391 次 |
| 最近记录: |