0

アプリにボタンの色を変更するオプションがあります。そのために UIImage のカテゴリを使用します。ボタンを特定の色で着色/焼き付けするつもりはありませんでしたが、すべての白(255、255、255)ピクセルをNSUserDefaultsに保存されている色に置き換えました。ボタンは、背景が透明なシャッフル アイコンです。白を赤に置き換えると、次のようになります。 ここに画像の説明を入力

http://brandontreb.com/image-manipulation-retrifying-and-updating-pixel-values-for-a-uiimageからコードを作成 しました。ピクセルを置き換えるために使用するコードは次のとおりです。これをUIImageカテゴリに入れました:

-(UIImage *)replaceWhiteWith{
    NSString *str = [[NSUserDefaults standardUserDefaults] objectForKey:@"color"];
    UIColor *color = [NSString colorFromNSString:str];
    return [self replaceWithColor:color];
}

-(UIImage *) replaceWithColor:(UIColor *)color {
    CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
    CGContextRef ctx;
    CGImageRef imageRef = [self 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 = 0;
    for (int ii = 0 ; ii < width * height ; ++ii)
    {
        if(rawData[byteIndex] == 255 && rawData[byteIndex+1] == 255  && rawData[byteIndex+2] == 255){
            rawData[byteIndex] = (red) * 255;
            rawData[byteIndex+1] = (green) * 255;
            rawData[byteIndex+2] = (blue) * 255;
            rawData[byteIndex+3] = (alpha) * 255;
        }

        byteIndex += 4;
    }


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

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

    CGContextRelease(ctx);

    return rawImage;
}
4

1 に答える 1