سؤال

أعلم أن هناك بالفعل 2 منشورات ذات صلة على ذلك، لكنها ليست واضحة ...

لذلك هذا القضية هذا ...:

انا املك UIImage التي تتكون من png ملف مطلوب من عنوان URL على الشبكة. هل من الممكن إخفاء اللون الأبيض بحيث يصبح شفافا؟

كل ما جربته حتى الآن CGImageCreateWithMaskingColors, ، إرجاع صورة بيضاء ...

أي مساعدة الرجال سيكون ثمين :)

هل كانت مفيدة؟

المحلول

حسنا منذ أن وجدت حلا وأنه يعمل بشكل جيد، أجاب على سؤالي وأعتقد حقا أن هذا سيكون مفيدا لكثير من الأشخاص الذين لديهم نفس الحاجة.

بادئ ذي بدء، اعتقدت أنه سيكون من الجيد أن تمديد بلدي 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