0

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

我通过数字色度计选择像素的颜色值,它为深色皮肤提供 RGB 值 [red=101,green=63 和 blue=43],对于白色皮肤,它提供 RGB 值 [red=253,green= 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];

}

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

在此处输入图像描述

4

1 回答 1

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 颜色更容易。

于 2012-11-13T22:37:06.090 回答