0

これでUIImageに緑色の線を引きます: CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext() , 0 , 1 , 0 , 1);

それはうまくいきます

しかし、緑のストロークを透明に置き換えたい

私はこの機能を使用します:

    - (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;
}

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

CGContextRelease(context);
free(rawData);

return result;
    }

UIImageで1つの色を透明にする方法で見つけたのは?

理由はわかりませんが、ストロークの境界にあるすべての緑色のピクセルがまだ UIImage にあります

何か案が ?

結果の画像は次のとおりです (ストロークのパスは中央にあり、周囲に緑色のピクセルがいくつか見られます)

ここに画像の説明を入力

前もって感謝します

4

0 に答える 0