문제

이미 관련 게시물이 이미 있다는 것을 알고 있지만 명확하지 않습니다 ...

그래서 사건은 이것입니다 ... :

나는있다 UIImage a로 구성됩니다 png 그물의 URL에서 요청 된 파일. 흰색 색상을 마스킹하여 투명하게 해줄 수 있습니까?

내가 지금까지 시도한 모든 것 CGImageCreateWithMaskingColors, 흰색 이미지를 반환합니다 ...

모든 도움을받는 사람은 소중합니다 :)

도움이 되었습니까?

해결책

OK 솔루션을 찾았고 잘 작동하기 때문에 내 질문에 대답하고 있으며 이것이 같은 필요를 가진 많은 사람들에게 유용 할 것이라고 믿습니다.

우선 나는 그것이 내 연장이 좋을 것이라고 생각했다. UIImages 카테고리를 통해 :

uiimage+utils.h

#import <UIKit/UIKit.h>

@interface UIImage (Utils)

- (UIImage*)imageByClearingWhitePixels;
@end

uiimage+utils.m

#import "UIImage+Utils.h"

@implementation UIImage (Utils)

#pragma mark Private Methods
- (CGImageRef) CopyImageAndAddAlphaChannel:(CGImageRef) sourceImage {
    CGImageRef retVal = NULL;

    size_t width = CGImageGetWidth(sourceImage);
    size_t height = CGImageGetHeight(sourceImage);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);

    if (offscreenContext != NULL) {
        CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);

        retVal = CGBitmapContextCreateImage(offscreenContext);
        CGContextRelease(offscreenContext);
    }

    CGColorSpaceRelease(colorSpace);

    return retVal;
}

- (UIImage *) getMaskedArtworkFromPicture:(UIImage *)image withMask:(UIImage *)mask{

    UIImage *maskedImage;
    CGImageRef imageRef = [self CopyImageAndAddAlphaChannel:image.CGImage];
    CGImageRef maskRef = mask.CGImage;
    CGImageRef maskToApply = CGImageMaskCreate(CGImageGetWidth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvider(maskRef), NULL, NO);
    CGImageRef masked = CGImageCreateWithMask(imageRef, maskToApply);
    maskedImage = [UIImage imageWithCGImage:masked];
    CGImageRelease(imageRef);
    CGImageRelease(maskToApply);
    CGImageRelease(masked);
    return maskedImage;

}

#pragma mark Public Methods
- (UIImage*)imageByClearingWhitePixels{

    //Copy image bitmaps
    float originalWidth = self.size.width;
    float originalHeight = self.size.height;
    CGSize newSize;

    newSize = CGSizeMake(originalWidth, originalHeight);

    UIGraphicsBeginImageContext( newSize );

    [self drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    //Clear white color by masking with self
    newImage = [self getMaskedArtworkFromPicture:newImage withMask:newImage];

    return newImage;
}

@end

마지막으로, 나는 다음과 같이 사용할 수 있습니다 : (수입 후 UIImage+Utils.h 물론이야)

UIImage *myImage = [...]; //A local png file or a file from a url
UIImage *myWhitelessImage = [myImage imageByClearingWhitePixels]; // Hooray!

다른 팁

실제로는 불가능합니다. 최소한 쉬운 방법은 없으며 API 호출은 없습니다. 기본적으로 Photoshop에서 일반적으로 수행되는 이미지 편집 문제입니다. 투명한 배경을 가진 대부분의 이미지가 그렇게 만들어졌습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top