0

白い肌の顔を暗い肌の顔に変更する必要があります...たとえば、アメリカの白い顔をアフリカの顔(つまり色調)に変更します...

ピクセルのカラー値をデジタルカラーメーターで選択すると、暗い肌の場合は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];

}

上記の色の変化についてのアイデアを共有してください....コードでどのような間違いをしましたか?..

ここに画像の説明を入力してください

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。このコピーを取得したら、それを操作して新しい画像を作成できます。

ピクセルの選択 ご質問のとおり、肌の色を白から黒に変更したいということは理解できたようです。現在のコードは、すべてのピクセルを繰り返し処理して色を変更します。ピクセルの色と探しているものとの間の「距離」を評価し、それが特定のしきい値を下回っている場合はそれを処理する必要があります。RGB カラーを処理するよりも、 HSVで操作を実行する方が簡単な場合があります。

于 2012-11-13T22:37:06.090 に答える