【问题标题】:How change the white skin face to dark skin face in iOS?如何在 iOS 中将白皮肤的脸变成黑皮肤的脸?
【发布时间】:2012-07-13 21:49:21
【问题描述】:

我需要把白皮肤的脸换成黑皮肤的脸... 例如美国白人脸对非洲人脸(即色调)......

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

}

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

【问题讨论】:

    标签: ios5 uiimage uicolor skin argb


    【解决方案1】:

    我不是 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-08-06
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多