2013-07-08 35 views
0

我想將RGB的負值應用到圖像中。負值顏色適用於圖像

R: -8 
G: -89 
B: -76 

我知道RGB的值在0到255之間,但我想應用負值並設置偏移量,但不知道該怎麼做。

我正在使用以下鏈接以供參考。

http://blog.swishzone.com/?p=9606

我使用

red value = (original red value * redMultiplier) + redOffset 
green value = (original green value * greenMultiplier) + greenOffset 
blue value = (original blue value * blueMultiplier) + blueOffset 

但它不工作,因爲我想要的。

+0

非正值行不通 – vladkras

+0

是的,我知道,但基於鏈接,我過去在發佈其範圍-255到255,我不知道如何使用之間。 –

+0

是的,但似乎這個人使得數字在0到255之間的範圍內,然後在使用 – vladkras

回答

0

找到了一種使用負RGB值更改圖像顏色的解決方案。以下是不影響圖像alpha的方法。

-(void)ColorChangeProcessing :(int)redvalue greenValue:(int)greenvalue blueValue:(int)bluevalue imageUsed : (UIImageView *)image 
{ 

    CGContextRef ctx; 
    CGImageRef imageRef = [image.image CGImage]; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(height * width * 4); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 

    int byteIndex = (bytesPerRow * 0) + 0 * bytesPerPixel,RED = redvalue,GREEN=greenvalue,BLUE = bluevalue; 


    for (int ii = 0 ; ii < width * height ; ++ii) 
    { 
     if(rawData[byteIndex+3] != 0 && (rawData[byteIndex] != '/0' || rawData[byteIndex+1] != '/0' || rawData[byteIndex+2] != '/0' )) 
     { 


      if ((((rawData[byteIndex])+RED)) > 255) 
      { 
       rawData[byteIndex] = (char)255; 
      } 
      else if((((rawData[byteIndex])+RED)) >0) 
      { 
       rawData[byteIndex] = (char) (((rawData[byteIndex] * 1.0) + RED)); 
      } 
      else 
      { 
       rawData[byteIndex] = (char)0; 
      } 


      if ((((rawData[byteIndex+1])+GREEN)) > 255) 
      { 
       rawData[byteIndex+1] = (char)255; 
      } 
      else if((((rawData[byteIndex+1])+GREEN))>0) 
      { 
       rawData[byteIndex+1] = (char) (((rawData[byteIndex+1] * 1.0) + GREEN)); 


      } 
      else 
      { 
       rawData[byteIndex+1] = (char)0; 
      } 



      if ((((rawData[byteIndex+2])+BLUE)) > 255) 
      { 
       rawData[byteIndex+2] = (char)255; 
      } 
      else if((((rawData[byteIndex+2])+BLUE))>0) 
      { 
       rawData[byteIndex+2] = (char) (((rawData[byteIndex+2] * 1.0) + BLUE)); 


      } 
      else 
      { 
       rawData[byteIndex+2] = (char)0; 
      } 
     } 
     byteIndex += 4; 
    } 

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

    CGImageRef NewimageRef = CGBitmapContextCreateImage (ctx); 
    UIImage* rawImage = [UIImage imageWithCGImage:NewimageRef]; 



    tempViewForProcessingColors = [[UIImageView alloc] init]; 
    tempViewForProcessingColors = [[arrayWithDictionary objectAtIndex:ImageCount]valueForKey:@"imageView"]; 

// NSLog(@"Name: %@ --- Red: %d --- Green: %d --- Blue: %d",tempViewForProcessingColors.accessibilityLabel,RED,GREEN,BLUE); 
    tempViewForProcessingColors.image = rawImage; 
    //ImageCount++; 
    CGContextRelease(ctx); 
    free(rawData); 
    CGImageRelease(NewimageRef); 

}