Как я могу изменить насыщенность UIImage?

Хотя конкретные устройства, поддерживаемые PGI, будут меняться в зависимости от версии компилятора PGI, для PGI 18.10 мы поддерживаем устройства с графическим процессором NVIDIA с вычислительными возможностями от 3,0 до 7,0. (См .: https://www.pgroup.com/resources/docs/18.10/x86/pgi-release-notes/index.htm#compute-cap )

Официально, PGI поддерживает линейку продуктов Tesla. Но под поддержкой мы имеем в виду устройства, на которых мы провели обширное тестирование. На практике другие устройства NVIDIA, такие как продукты GeForce и Quadro, которые используют те же вычислительные возможности, также должны работать.

16
задан Peter Hosey 16 January 2010 в 08:48
поделиться

3 ответа

Для этого есть фильтр CoreImage. CIColorControls Просто установите inputSaturation на < 1,0 для обесцвечивания или> 1,0 для увеличения насыщенности ...

, например. Вот метод, который я добавил в категорию на UIImage для обесцвечивания изображения.

-(UIImage*) imageDesaturated {
    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage *ciimage = [CIImage imageWithCGImage:self.CGImage];
    CIFilter *filter = [CIFilter filterWithName:@"CIColorControls"];
    [filter setValue:ciimage forKey:kCIInputImageKey];
    [filter setValue:@0.0f forKey:kCIInputSaturationKey];
    CIImage *result = [filter valueForKey:kCIOutputImageKey];
    CGImageRef cgImage = [context createCGImage:result fromRect:[result extent]];
    UIImage *image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    return image;
}
16
ответ дан 30 November 2019 в 16:42
поделиться

Ничего такого простого. Самым простым решением, вероятно, является создание CGContext в памяти с известным форматом пикселей, рисование изображения в этом контексте, а затем чтение / изменение пикселей в буфере известного формата.

Я не думаю, что CG поддерживает цвет пространство с отдельным каналом насыщенности, так что вам придется либо преобразовать из RGB в HSV или HSL, либо выполнять вычисления непосредственно в пространстве RGB.


Один из способов выполнить вычисления непосредственно в RGB может быть примерно таким:

average = (R + G + B) / 3;
red_delta = (R - average) * 11 / 10;
green_delta = (G - average) * 11 / 10;
blue_delta = (B - average) * 11 / 10;

R = average + red_delta;
G = average + green_delta;
B = average + blue_delta;
// clip R,G,B to be in 0-255 range

Это сдвинет каналы, которые отошли от среднего примерно на 10% дальше. Это почти похоже на увеличение насыщенности, хотя это даст сдвиг оттенка для некоторых цветов.

4
ответ дан 30 November 2019 в 16:42
поделиться

Начиная с шаблона приложения на основе просмотра, создайте новый подкласс UIView, например:

// header file
@interface DesatView : UIView {
     UIImage *image;
     float saturation;
}
@property (nonatomic, retain) UIImage *image;
@property (nonatomic) float desaturation;
@end  

// implementation file
#import "DesatView.h"
@implementation DesatView
@synthesize image, desaturation;

-(void)setSaturation:(float)sat;
    {
        saturation = sat;
        [self setNeedsDisplay];
    }

- (id)initWithFrame:(CGRect)frame {
     if (self = [super initWithFrame:frame]) {
          self.backgroundColor = [UIColor clearColor]; // else background is black
          desaturation = 0.0; // default is no effect
     }
     return self;
}

- (void)drawRect:(CGRect)rect {
     CGContextRef context = UIGraphicsGetCurrentContext();
     CGContextSaveGState(context);

     CGContextTranslateCTM(context, 0.0, self.bounds.size.height); // flip image right side up
     CGContextScaleCTM(context, 1.0, -1.0);

     CGContextDrawImage(context, rect, self.image.CGImage);
     CGContextSetBlendMode(context, kCGBlendModeSaturation);
     CGContextClipToMask(context, self.bounds, image.CGImage); // restricts drawing to within alpha channel
     CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, desaturation);
     CGContextFillRect(context, rect);

     CGContextRestoreGState(context); // restore state to reset blend mode
}
@end

Теперь в методе ViewDload Controldload Controldload, поставьте вид на экран и установите насыщенность, как это :

- (void)viewDidLoad {
    [super viewDidLoad];  

    DesatView *dv = [[DesatView alloc] initWithFrame:CGRectZero];
    dv.image = [UIImage imageNamed:@"someImage.png"];
    dv.frame = CGRectMake(0, 0, dv.image.size.width, dv.image.size.height);
    dv.center = CGPointMake(160, 240); // put it mid-screen
    dv.desaturation = 0.2; // desaturate by 20%,

    [self.view addSubview:dv];  // put it on screen   
}  

Измените насыщенность, как это:

 dv.saturation = 0.8; // desaturate by 80%  

, очевидно, если вы хотите использовать его вне единого способа, вы должны сделать DV ивар контроллера просмотра. Надеюсь это поможет.

9
ответ дан 30 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: