iOS:创建一个更暗的UIImage版本并保持透明像素不变?

hzx*_*zxu 12 core-graphics objective-c uiimage ios

我发现

通过向现有UIImage添加阴影来创建新的UIImage

UIImage,有一种简单的方法可以使它变暗或全黑

但选定的答案对我不起作用.

我有一个UIImage,其中可能有一些透明像素,我需要创建一个新的UIImage,其中非透明像素变暗,有什么办法可以做到这一点吗?我正在考虑使用UIBezierPath,但我不知道如何只为非透明像素做这件事.

Dav*_*ndz 31

这是我用来为图像着色的类,即使它们是透明的.

+ (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color {
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect area = CGRectMake(0, 0, image.size.width, image.size.height);

    CGContextScaleCTM(context, 1, -1);
    CGContextTranslateCTM(context, 0, -area.size.height);

    CGContextSaveGState(context);
    CGContextClipToMask(context, area, image.CGImage);

    [color set];
    CGContextFillRect(context, area);

    CGContextRestoreGState(context);

    CGContextSetBlendMode(context, kCGBlendModeMultiply);

    CGContextDrawImage(context, area, image.CGImage);

    UIImage *colorizedImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return colorizedImage;
}
Run Code Online (Sandbox Code Playgroud)

要使图像变暗,您将通过该方法将黑色或灰色UIColor透明度降低.

  • 谢谢!建议的改进:使用`UIGraphicsBeginImageContextWithOptions(image.size,NO,image.scale)`来保留比例,否则彩色图像在Retina显示屏上会模糊. (6认同)
  • @Merott我将继续编辑答案以包含您的建议.这可能是主持人被拒绝,但如果OP很高兴,希望他们会重新打补丁. (2认同)

bry*_*yle 16

如何尝试CoreImage过滤器?

您可以使用CIColorControls滤镜调整输入亮度和对比度以使图像变暗.

CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [[CIImage alloc] initWithImage:sourceImage]; //your input image

CIFilter *filter= [CIFilter filterWithName:@"CIColorControls"];
[filter setValue:inputImage forKey:@"inputImage"];
[filter setValue:[NSNumber numberWithFloat:0.5] forKey:@"inputBrightness"];

// Your output image
UIImage *outputImage = [UIImage imageWithCGImage:[context createCGImage:filter.outputImage fromRect:filter.outputImage.extent]];
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关CIFilter参数的更多信息:

http://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html%23//apple_ref/doc/filter/ci/CIColorControls


小智 5

这是一个快速的Swift版本,使用CIExposureAdjust CIFilter :)

  // Get the original image and set up the CIExposureAdjust filter
  guard let originalImage = UIImage(named: "myImage"),
    let inputImage = CIImage(image: originalImage),
    let filter = CIFilter(name: "CIExposureAdjust") else { return }

  // The inputEV value on the CIFilter adjusts exposure (negative values darken, positive values brighten)
  filter.setValue(inputImage, forKey: "inputImage")
  filter.setValue(-2.0, forKey: "inputEV")

  // Break early if the filter was not a success (.outputImage is optional in Swift)
  guard let filteredImage = filter.outputImage else { return }

  let context = CIContext(options: nil)
  let outputImage = UIImage(CGImage: context.createCGImage(filteredImage, fromRect: filteredImage.extent))

  myImageView.image = outputImage // use the filtered UIImage as required.
Run Code Online (Sandbox Code Playgroud)