2009-03-11 4 views

답변

12
-(void)changeColor 
{ 
    UIImage *temp23=[UIImage imageNamed:@"leaf.png"]; 
    CGImageRef ref1=[self createMask:temp23]; 
    const float colorMasking[6] = {1.0, 2.0, 1.0, 1.0, 1.0, 1.0}; 
    CGImageRef New=CGImageCreateWithMaskingColors(ref1, colorMasking); 
    UIImage *resultedimage=[UIImage imageWithCGImage:New]; 
} 

-(CGImageRef)createMask:(UIImage*)temp 
{ 
    CGImageRef ref=temp.CGImage; 
    int mWidth=CGImageGetWidth(ref); 
    int mHeight=CGImageGetHeight(ref); 
    int count=mWidth*mHeight*4; 
    void *bufferdata=malloc(count); 

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 

    CGContextRef cgctx = CGBitmapContextCreate (bufferdata,mWidth,mHeight, 8,mWidth*4, colorSpaceRef, kCGImageAlphaPremultipliedFirst); 

    CGRect rect = {0,0,mWidth,mHeight}; 
    CGContextDrawImage(cgctx, rect, ref); 
    bufferdata = CGBitmapContextGetData (cgctx); 

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bufferdata, mWidth*mHeight*4, NULL); 
    CGImageRef savedimageref = CGImageCreate(mWidth,mHeight, 8, 32, mWidth*4, colorSpaceRef, bitmapInfo,provider , NULL, NO, renderingIntent); 
    CFRelease(colorSpaceRef); 
    return savedimageref; 
} 

위의 코드를 테스트하고 난 당신의 기능의 사용 후 마스크

+2

코드 내가 어떤 green.or 빨간색으로 변경 어떻게 훌륭하네요 작동 다른 색상 –

+2

좋은 기능을 이용해 주셔서 감사합니다. 그러나 나는이 변경을하지 않을 때까지 참된 결과를 얻을 수 없었다 : kCGImageAlphaPremultipliedFirst -> kCGImageAlphaPremultipliedLast 그 함수가 나에게 진정한 결과를 주었다. :) 고맙습니다. – Vitaly

+0

녹색을 검정색으로 변경하려면 어떻게해야합니까? – isarathg

1

나는 이런 자신을 전혀 해 본 적이 없지만, CGImageCreateWithMaskingColors이 여기에 유용 할 것 같습니다. Core Graphics를 사용하는 것은이 사이트의 대답에서 설명 할 수있는 범위를 벗어납니다. 문서를보고 웹에서 자습서를 검색하십시오.

10

를 사용하여 붉은 색으로 녹색을 변경, 나는

:)있는 UIImage에 대한 배경을 투명하게 만드는 더 간단한 방법을 발견

예를 들어 검정색 배경의 PNG 이미지가 있고 화면에서이 배경을 투명하게 만들려는 경우입니다.

이 작업을 시도 할 수 있습니다 : 투명 배경

UIImage * image = [UIImage imageNamed:@"image.png"]; 

const CGFloat colorMasking[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; 
image = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(image.CGImage, colorMasking)]; 

당신은 가지고 이미지를.

모두가

+3

이것은 검은 색을 흰색으로 만들어서 투명하지 않게합니다 .... –

+0

perfect! 그것은 나를 위해 잘 작동합니다! – JonasG

+0

이것은 기본적으로 허용되는 답변의 작은 부분과 동일하지 않으며 @AshishMathur에 동의합니다. 완전한 해결책은 아닙니다. – PKCLsoft

11

이 기능이 작동 할 수 있습니다!

-(UIImage *)changeWhiteColorTransparent: (UIImage *)image 
{ 
    CGImageRef rawImageRef=image.CGImage; 

    const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

    UIGraphicsBeginImageContext(image.size); 
    CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); 
    { 
     //if in iphone 
     CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); 
     CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); 
    } 

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    CGImageRelease(maskedImageRef); 
    UIGraphicsEndImageContext();  
    return result; 
} 
+1

Brilliant! 방금 요청한 것이 었습니다. 상자에서 일했습니다! 감사. – PKCLsoft

+5

이렇게하면 전체 이미지가 투명 해집니다. 내가 놓친 게 있니? –

32

확인. 시도해 본 결과, 얼마나 많은 버전의 솔루션이 있는지 알지 못했지만, 나만의 맞춤형 버전이 있습니다. 내가 찾은 바는 @yubenyi의 솔루션이 아주 잘 작동하지만, changeWhiteColorTransparent() 함수의 출력을 가져 와서 다시 전달하려는 경우 작동하지 않는다는 것입니다.

내 첫 번째 단계는 발신자가 투명하게 만들 수있는 다양한 색상을 지정할 수 있도록 특정 색상 및 공차를 허용하도록 기능을 변경하는 것이 었습니다. 이것은 거의 변함없이 잘 동작했지만 출력이 두 번째 색상 범위의 동일한 코드를 통과하는 데 유효한 이미지가 아니라는 사실을 발견했습니다.

많은 시행 착오 끝에 색상 교체 작업을 직접 수행했습니다. 나는이 일을하기위한 API가있을 때 너무 힘들어 보였지만 항상 자신이 원하는 방식으로 행동하는 것은 아니기 때문에 이것을 거부했습니다. 특히, CGImageCreateWithMaskingColors()의 출력은 동일한 함수에 대한 다른 호출의 입력으로 사용될 수 없습니다. 이유를 찾지 못했지만 알파 채널과 관련이 있다고 생각합니다. 어떤 경우

, 내 솔루션입니다 :

- (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance { 
    CGImageRef imageRef = [image CGImage]; 

    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    NSUInteger bitmapByteCount = bytesPerRow * height; 

    unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char)); 

    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

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

    CGColorRef cgColor = [color CGColor]; 
    const CGFloat *components = CGColorGetComponents(cgColor); 
    float r = components[0]; 
    float g = components[1]; 
    float b = components[2]; 
    //float a = components[3]; // not needed 

    r = r * 255.0; 
    g = g * 255.0; 
    b = b * 255.0; 

    const float redRange[2] = { 
     MAX(r - (tolerance/2.0), 0.0), 
     MIN(r + (tolerance/2.0), 255.0) 
    }; 

    const float greenRange[2] = { 
     MAX(g - (tolerance/2.0), 0.0), 
     MIN(g + (tolerance/2.0), 255.0) 
    }; 

    const float blueRange[2] = { 
     MAX(b - (tolerance/2.0), 0.0), 
     MIN(b + (tolerance/2.0), 255.0) 
    }; 

    int byteIndex = 0; 

    while (byteIndex < bitmapByteCount) { 
     unsigned char red = rawData[byteIndex]; 
     unsigned char green = rawData[byteIndex + 1]; 
     unsigned char blue = rawData[byteIndex + 2]; 

     if (((red >= redRange[0]) && (red <= redRange[1])) && 
      ((green >= greenRange[0]) && (green <= greenRange[1])) && 
      ((blue >= blueRange[0]) && (blue <= blueRange[1]))) { 
      // make the pixel transparent 
      // 
      rawData[byteIndex] = 0; 
      rawData[byteIndex + 1] = 0; 
      rawData[byteIndex + 2] = 0; 
      rawData[byteIndex + 3] = 0; 
     } 

     byteIndex += 4; 
    } 

    CGImageRef imgref = CGBitmapContextCreateImage(context); 
    UIImage *result = [UIImage imageWithCGImage:imgref]; 

    CGImageRelease(imgref); 
    CGContextRelease(context); 
    free(rawData); 

    return result; 
} 
+3

관용이있을 수 있기 때문에 이것은 나를 위해 내가 좋아하는 대답이다. 참고 : 허용 오차는 0에서 255 사이이므로 아무런 영향을 미치지 않습니다. 부드러운 버전이 이제 완벽 할 것입니다! – Diwann

+0

감사합니다. 완벽하게 작동합니다 ... +1 +1 @pkclSoft – Babul

+0

내 하루를 저장했습니다. 건배 ... – Maulik

16

이 여러 패스와 함께 작동합니다 yubenyi의 코드 팅겨입니다. 이미지를 압축되지 않은 JPEG로 변환하여 처리하기 전에 알파 채널을 제거합니다. 또한 색상 범위 선택 방법에 대한 의견을 추가했습니다.

-(UIImage *)changeWhiteColorTransparent: (UIImage *)image 
{ 
    //convert to uncompressed jpg to remove any alpha channels 
    //this is a necessary first step when processing images that already have transparency 
    image = [UIImage imageWithData:UIImageJPEGRepresentation(image, 1.0)]; 
    CGImageRef rawImageRef=image.CGImage; 
    //RGB color range to mask (make transparent) R-Low, R-High, G-Low, G-High, B-Low, B-High 
    const double colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

    UIGraphicsBeginImageContext(image.size); 
    CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); 

    //iPhone translation 
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height); 
    CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); 

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef); 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    CGImageRelease(maskedImageRef); 
    UIGraphicsEndImageContext();  
    return result; 
} 
+0

코드 첫 줄에 imgLoad 란 무엇입니까? – Dejell

+0

"이미지"라고 생각했습니다. 나는 편집을했다. 수정 주셔서 감사! – bgolson

+1

나를 위해 일했습니다!하지만'const float colorMasking [6]'을'const double colorMasking [6]'으로 바꿔야 만했습니다. – moobi

1

는 @PKCLsoft의 훌륭한 답변에 따라, 나는 단지 화이트 색상 투명하게 편집했다,하지만 픽셀이 얼마나 "흰색"을 기반으로 알파합니다. 이것은 흑백 이미지에서 마스크를 만들려고 할 때 유용 할 수 있으므로 텍스트 나 도형에 부드러운 가장자리를줍니다.나는 희망

- (UIImage *)makeWhiteColorTransparentInImage:(UIImage *)image { 
    CGImageRef imageRef = [image CGImage]; 

    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    NSUInteger bitmapByteCount = bytesPerRow * height; 

    unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char)); 

    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
              bitsPerComponent, bytesPerRow, colorSpace, 
              kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

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

    int byteIndex = 0; 

    while (byteIndex < bitmapByteCount) { 
     unsigned char red = rawData[byteIndex]; 
     unsigned char green = rawData[byteIndex + 1]; 
     unsigned char blue = rawData[byteIndex + 2]; 
     unsigned char alpha = rawData[byteIndex + 3]; 

     if (alpha == 0.0) { 
      rawData[byteIndex + 3] = 0.0; 
     } else { 
      rawData[byteIndex + 3] = 255.0 - (red + green + blue)/3.0; 
     } 

     byteIndex += 4; 
    } 

    CGImageRef imgref = CGBitmapContextCreateImage(context); 
    UIImage *result = [UIImage imageWithCGImage:imgref]; 

    CGImageRelease(imgref); 
    CGContextRelease(context); 
    free(rawData); 

    return result; 
} 

은 도움이 사람이 어떤 일 :

1

스위프트 4 : (흰색 마스크에 대한)

extension UIImage { 
func imageByMakingWhiteBackgroundTransparent() -> UIImage? { 

    let image = UIImage(data: UIImageJPEGRepresentation(self, 1.0)!)! 
    let rawImageRef: CGImage = image.cgImage! 

    let colorMasking: [CGFloat] = [222, 255, 222, 255, 222, 255] 
    UIGraphicsBeginImageContext(image.size); 

    let maskedImageRef = rawImageRef.copy(maskingColorComponents: colorMasking) 
    UIGraphicsGetCurrentContext()?.translateBy(x: 0.0,y: image.size.height) 
    UIGraphicsGetCurrentContext()?.scaleBy(x: 1.0, y: -1.0) 
    UIGraphicsGetCurrentContext()?.draw(maskedImageRef!, in: CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height)) 
    let result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return result 

    } 
} 
관련 문제