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



我找到

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

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

但是所选的答案对我不起作用。

我有一个UIImage,里面可能有一些透明像素,我需要创建一个不透明像素变暗的新UIImage,有什么方法可以做到吗?我曾想过使用UIBezierPath,但我不知道如何只针对不透明像素。

这是我用来给图像上色的类,即使它们是透明的。

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

要使图像变暗,您需要向该方法传递透明度降低的黑色或灰色UIColor。

试试CoreImage Filter怎么样?

您可以使用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]];

点击此处阅读更多关于CIFilter参数的信息:

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

这里有一个快速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.

以下是David在Swift 5:中的回答

class func colorizeImage(_ image: UIImage?, with color: UIColor?) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(image?.size ?? CGSize.zero, _: false, _: image?.scale ?? 0.0)
    let context = UIGraphicsGetCurrentContext()
    let area = CGRect(x: 0, y: 0, width: image?.size.width ?? 0.0, height: image?.size.height ?? 0.0)
    context?.scaleBy(x: 1, y: -1)
    context?.translateBy(x: 0, y: -area.size.height)
    context?.saveGState()
    context?.clip(to: area, mask: (image?.cgImage)!)
    color?.set()
    context?.fill(area)
    context?.restoreGState()
    if let context = context {
        context.setBlendMode(.multiply)
    }
    context!.draw((image?.cgImage)!, in: area)
    let colorizedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return colorizedImage
}

最新更新