我需要将白色皮肤脸变为深色皮肤脸... 例如美国白脸到非洲脸(即色调)......
我通过数字色度计选择像素的颜色值,它为深色皮肤提供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];
}
请分享有关上述变色的任何想法.... 我在代码中犯了什么错误?..
答案 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颜色更容易。