如何在iOS中将白色皮肤脸变为深色皮肤?

时间:2012-07-13 21:49:22

标签: ios5 uiimage uicolor skin argb

我需要将白色皮肤脸变为深色皮肤脸... 例如美国白脸到非洲脸(即色调)......

我通过数字色度计选择像素的颜色值,它为深色皮肤提供RGB值[红色= 101,绿色= 63和蓝色= 43],对于白色皮肤,它给出RGB值为[红色= 253] ,绿色= 210,蓝色= 176] ......

然后我在我的代码中设置了该值,它给出了错误的结果......

这是我的代码......

   -(UIImage*)customBlackFilterOriginal
{
    CGImageRef imgSource=self.duplicateImage.image.CGImage;
    CFDataRef m_DataRef1 = CGDataProviderCopyData(CGImageGetDataProvider(imgSource)); 
    UInt8 *dataOriginal=(UInt8 *)CFDataGetBytePtr(m_DataRef1);
    double lengthSource=CFDataGetLength(m_DataRef1);
    NSLog(@"length::%f",lengthSource);
    int redPixel;
    int greenPixel;
    int bluePixel;

    for(int index=0;index<lengthSource;index+=4)
    {

        dataOriginal[index]=dataOriginal[index];
        dataOriginal[index+1]= 101;
        dataOriginal[index+2]= 63;
        dataOriginal[index+3]=43;      

    } 

    NSUInteger width =CGImageGetWidth(imgSource);
    size_t height=CGImageGetHeight(imgSource);
    size_t bitsPerComponent=CGImageGetBitsPerComponent(imgSource);
    size_t bitsPerPixel=CGImageGetBitsPerPixel(imgSource);
    size_t bytesPerRow=CGImageGetBytesPerRow(imgSource);

    NSLog(@"the w:%u H:%lu",width,height);

    CGColorSpaceRef colorspace=CGImageGetColorSpace(imgSource);
    CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(imgSource);
    CFDataRef newData=CFDataCreate(NULL,dataOriginal,lengthSource);
    CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData);
    CGImageRef newImg=CGImageCreate(width,height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorspace,bitmapInfo,provider,NULL,true,kCGRenderingIntentDefault);

    return [UIImage imageWithCGImage:newImg];

}

请分享有关上述变色的任何想法....  我在代码中犯了什么错误?..

enter image description here

1 个答案:

答案 0 :(得分:2)

我不是iPhone程序员,所以我无法测试任何东西,但代码中有些东西很奇怪:

像素大小 在阅读您的数据时,您似乎假设您拥有32位ARGB图片,您是否确认了这种情况?

<强> CFDataGetBytePtr 根据文档Returns a read-only pointer to the bytes of a CFData object.,您确定自己没有找CFDataGetBytes Copies the byte contents of a CFData object to an external buffer.在哪种情况下,您必须分配缓冲区以包含width * height * bpp 。一旦你有这个副本,无论如何你都可以操作它来创建新图片。

像素选择 根据你的问题,我似乎明白你想要将肤色从白色变为黑色。您当前的代码会迭代每个像素以更改其颜色。您应该评估像素颜色与您要查找的颜色之间的“距离”,如果它低于某个阈值则处理它。在HSV中执行操作可能比处理RGB颜色更容易。