2013-04-26 21 views
14

MY-Code: Wie RGB-Wert für verschiedene Schattierungen von Gesicht zu verwalten, und wie Sie anwenden? dieser code wird die farbe des gesichts mit haare ändern, aber ich möchte 1.nicht gesicht gefärbt werden ausschließlich haare.Wie ändere ich die Hautfarbe von Gesicht aus dem Quellbild in ios?

-(void)changeSkinColorValue:(float)value WithImage:(UIImage*)needToModified 
    { 

     CGContextRef ctx; 

     CGImageRef imageRef = needToModified.CGImage; 
     NSUInteger width = CGImageGetWidth(imageRef); 
     NSUInteger height = CGImageGetHeight(imageRef); 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     //unsigned char *rawData = malloc(firstImageV.image.size.height * firstImageV.image.size.width * 10); 

     CFMutableDataRef m_DataRef = CFDataCreateMutableCopy(0, 0,CGDataProviderCopyData(CGImageGetDataProvider(firstImageV.image.CGImage))); 
     UInt8 *rawData = (UInt8 *) CFDataGetMutableBytePtr(m_DataRef); 
     int length = CFDataGetLength(m_DataRef); 
     NSUInteger bytesPerPixel = 4; 
     NSUInteger bytesPerRow = bytesPerPixel * firstImageV.image.size.width; 
     NSUInteger bitsPerComponent = 8; 

       CGContextRef context1 = CGBitmapContextCreate(rawData, firstImageV.image.size.width, firstImageV.image.size.height, bitsPerComponent, bytesPerRow, colorSpace,      kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
     CGColorSpaceRelease(colorSpace); 

     CGContextDrawImage(context1, CGRectMake(0, 0, firstImageV.image.size.width, firstImageV.image.size.height), imageRef); 

     NSLog(@"%d::%d",width,height); 


     // for(int ii = 0 ; ii < 250 ; ii+=4) 
     //{ 

      for(int ii = 0 ; ii < length ; ii+=4) 
      { 
      //NSLog(@"Raw data %s",rawData); 

      int R = rawData[ii]; 
      int G = rawData[ii+1]; 
      int B = rawData[ii+2]; 

      //  NSLog(@"%d %d %d", R, G, B); 
      //if(((R>60)&&(R<237)) || ((G>10)&&(G<120))||((B>4) && (B<120))) 
       //  if(((R>100)&&(R<186)) || ((G>56)&&(G<130))||((B>30) && (B<120))) 
       //  if(((R>188)&&(R<228)) || ((G>123)&&(G<163))||((B>85) && (B<125))) 
         // if(((R>95)&&(R<260)) || ((G>40)&&(G<210))||((B>20) && (B<170))) 

         //new code...... 

       if(((R>0)&&(R<260)) || ((G>0)&&(G<210))||((B>0) && (B<170))) 

        { 
         rawData[ii+1]=R;//13; 
         rawData[ii+2]=G;//43; 
         rawData[ii+3]=value;//63 
        } 
       } 


     ctx = CGBitmapContextCreate(rawData, 
          CGImageGetWidth(imageRef), 
          CGImageGetHeight(imageRef), 
          8, 
          CGImageGetBytesPerRow(imageRef), 
          CGImageGetColorSpace(imageRef), 
          kCGImageAlphaPremultipliedLast); 

     imageRef = CGBitmapContextCreateImage(ctx); 
     UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 
     //UIImageView *ty=[[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 400, 400)]; 
     //ty.image=rawImage; 
     //[self.view addSubview:ty]; 
     [secondImageV setImage:rawImage]; 
     CGContextRelease(context1); 
     CGContextRelease(ctx); 
     free(rawData); 
    } 
+0

Dieser Code ändert nicht nur Gesicht und Haare, sondern das ganze Bild, oder? –

+0

@SAMIR RATHOD können Sie mir in der gleichen Frage der Bildgesichtsfarbänderung helfen? http://stackoverflow.com/questions/37113740/change-face-color-from-main-color-in-xcode?noredirect=1#comment61769372_37113740 –

Antwort

0

Die schnelle Antwort ist Ihre OPs zu ändern:

  if(((R>0)&&(R<260)) || ((G>0)&&(G<210)) || ((B>0) && (B<170))) 

zu ANDs:

  if(((R>0)&&(R<260)) && ((G>0)&&(G<210)) && ((B>0) && (B<170))) 

dann Ihre RGB den Bereich der Hauttöne im Bild zu nähern reicht adjust (versuchen mit einigen Schiebereglern in Ihrer Benutzeroberfläche).

By the way, ich nehme an, Sie wissen, dass dies:

 rawData[ii+1]=R;//13; 
     rawData[ii+2]=G;//43; 
     rawData[ii+3]=value;//63 

wird den roten Kanal zu dem grünen Kanal, der grünen Kanal auf den blauen Kanal und value zu dem Alpha-Kanal zugewiesen wird. Ich erwarte nicht, dass du das willst.

Auch Ihr needToModified Bild ist wahrscheinlich das gleiche Bild wie firstImageV.image, das nicht in Ihrem Code wiedergegeben wird, wie es jetzt ist.

Dieser Ansatz funktioniert nur, wenn Ihre identifizierten Farbbereiche vollständig und nur in den Bereichen des Bildes vorhanden sind.

A lange Antwort auf anspruchsvollere Auswahl der Farbbereiche, alternative Möglichkeiten zur Auswahl Bildbereiche, die Verwendung von CIFilter oder der OpenCV Rahmen aussehen könnte ...

+0

Nach dem AND-Operator bleibt einige Pixel aus Bild und Farbe alle image.Ich möchte nur Hautfarbe ändern. – madhyamika

+1

"Dieser Ansatz funktioniert nur, wenn Ihre identifizierten Farbbereiche vollständig und nur in den Bereichen des Bildes vorhanden sind." ... Dies ist ein sehr primitiver Ansatz zur Auswahl Ihrer Region von Interesse. Sie benötigen wirklich etwas wie Photoshop Zauberstab Werkzeug, um angrenzende ähnliche Bereiche eines Bildes und einige interaktive Benutzereingabe/UI auszuwählen. Ich schlage vor, Sie untersuchen [openCV] (http://openCV.org) ... – foundry

0

Versuchen Sie, das Bild Masking ... es wird helfen, den spezifischen Bereich von Farben in der Maske

Kodex zu ändern:

- (UIImage *)doctorTheImage:(UIImage *)originalImage 
{ 

    const float brownsMask[6] = {85, 255, 85, 255, 85, 255}; 


    UIImageView *imageView = [[UIImageView alloc] initWithImage:originalImage]; 

    UIGraphicsBeginImageContext(originalImage.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetRGBFillColor (context, 1.0,1.0, 1.0, 1); 


    CGContextFillRect(context, CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height)); 

    CGImageRef brownRef = CGImageCreateWithMaskingColors(imageView.image.CGImage, brownsMask); 

    CGRect imageRect = CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height); 

    CGContextTranslateCTM(context, 0, imageView.image.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    //CGImageRef whiteRef = CGImageCreateWithMaskingColors(brownRef, whiteMask); 
    CGContextDrawImage (context, imageRect, brownRef); 

    //[originalImage drawInRect:CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height)]; 

    CGImageRelease(brownRef); 
    // CGImageRelease(whiteRef); 

    UIImage *doctoredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return doctoredImage; 
} 
0

CFDataGetBytePtr die Dokumentation nach, es Gibt einen Nur-Lese-Zeiger auf die Bytes eines cfdata Objekt., Sind Sie sicher, dass Sie nicht für CFDataGetBytes suchen, die Kopiert die Byte Inhalt eines cfdata Objekt an einen externen Puffer. In diesem Fall müssen Sie Ihren Puffer so zuweisen, dass er width * height * bpp enthält. Sobald Sie diese Kopie haben, können Sie sie trotzdem manipulieren, um das neue Bild zu erstellen.

Pixelauswahl Nach Ihrer Frage scheint ich zu verstehen, dass Sie die Hautfarbe von Weiß zu Schwarz ändern möchten. Ihr aktueller Code iteriert über jedes Pixel, um seine Farbe zu ändern.Sie sollten die "Entfernung" zwischen der Pixelfarbe und dem, was Sie suchen, bewerten und, wenn sie unter einem bestimmten Schwellenwert liegt, diesen verarbeiten. Es könnte einfacher sein, den Vorgang in HSV als mit RGB-Farben durchzuführen

0

1) Holen Sie sich einen CGPath von Gesicht, wo Sie Ihren Algorithmus anwenden möchten. 2) Erhalten Sie Breite von CGimage.

int width = CGImageGetWidth(image); 

3) Holen Sie Pixel-CGPoint von derzeit Pixel verarbeiten. Überprüfen Sie den Zustand, bevor Sie Ihren Algorithmus anwenden. Und dann wenden Sie Ihre Bedingung an. Das ist es. Hier ist der Beispielcode.

CGFloat pointY = (int)(i/4)/(int)width; 
CGFloat pointX = (int)(i/4)%(int)width; 
CGPoint point = CGPointMake(pointX, pointY); 

if (CGPathContainsPoint(yourFacePath, NULL, point, NO)) 
{ 
    if(((R>0)&&(R<260)) || ((G>0)&&(G<210))||((B>0) && (B<170))) 
    { 
     rawData[ii+1]=R;//13; 
     rawData[ii+2]=G;//43; 
     rawData[ii+3]=value;//63 
    } 
} 
0

machen Sie das Gesicht und die Haare als Objekte. Objekt haben Farbe und haben eine globale Methode, um ihre Farben zu ändern. Machen Sie dann im Hauptteil beide Objekte (Haare, Gesicht) und geben Sie an, was genau Sie färben möchten. Das ist der richtige Ansatz. ich hoffe es hilft!