没有 UIImageView 的 UIImage 的反射

Posted

技术标签:

【中文标题】没有 UIImageView 的 UIImage 的反射【英文标题】:Reflection of UIImage without UIImageView 【发布时间】:2012-09-20 11:42:32 【问题描述】:

如何在不使用 UIImageView 的情况下创建 UIImage 的反射?我已经看到了使用两个 imageViews 进行反射的苹果代码,但我不想在我的应用程序中添加 imageview 我只想要原始图像和反射图像的整个图像。有没有人知道如何做到这一点。

【问题讨论】:

【参考方案1】:

这是来自 UIImage+FX.m,由Nick Lockwood创建

UIImage * processedImage = //here your image
processedImage = [processedImage imageWithReflectionWithScale:0.15f
                                                                          gap:10.0f
                                                                        alpha:0.305f];

scale是反射的大小,gap是图像和反射的距离,alpha是反射的alpha

- (UIImage *)imageWithReflectionWithScale:(CGFloat)scale gap:(CGFloat)gap alpha:(CGFloat)alpha

    //get reflected image
    UIImage *reflection = [self reflectedImageWithScale:scale];
    CGFloat reflectionOffset = reflection.size.height + gap;

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width, self.size.height + reflectionOffset * 2.0f), NO, 0.0f);

    //draw reflection
    [reflection drawAtPoint:CGPointMake(0.0f, reflectionOffset + self.size.height + gap) blendMode:kCGBlendModeNormal alpha:alpha];

    //draw image
    [self drawAtPoint:CGPointMake(0.0f, reflectionOffset)];

    //capture resultant image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return image
    return image;

- (UIImage *)reflectedImageWithScale:(CGFloat)scale

    //get reflection dimensions
    CGFloat height = ceil(self.size.height * scale);
    CGSize size = CGSizeMake(self.size.width, height);
    CGRect bounds = CGRectMake(0.0f, 0.0f, size.width, size.height);

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();

    //clip to gradient
    CGContextClipToMask(context, bounds, [[self class] gradientMask]);

    //draw reflected image
    CGContextScaleCTM(context, 1.0f, -1.0f);
    CGContextTranslateCTM(context, 0.0f, -self.size.height);
    [self drawInRect:CGRectMake(0.0f, 0.0f, self.size.width, self.size.height)];

    //capture resultant image
    UIImage *reflection = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return reflection image
    return reflection;

渐变蒙版

+ (CGImageRef)gradientMask

    static CGImageRef sharedMask = NULL;
    if (sharedMask == NULL)
    
        //create gradient mask
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 256), YES, 0.0);
        CGContextRef gradientContext = UIGraphicsGetCurrentContext();
        CGFloat colors[] = 0.0, 1.0, 1.0, 1.0;
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
        CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2);
        CGPoint gradientStartPoint = CGPointMake(0, 0);
        CGPoint gradientEndPoint = CGPointMake(0, 256);
        CGContextDrawLinearGradient(gradientContext, gradient, gradientStartPoint,
                                    gradientEndPoint, kCGGradientDrawsAfterEndLocation);
        sharedMask = CGBitmapContextCreateImage(gradientContext);
        CGGradientRelease(gradient);
        CGColorSpaceRelease(colorSpace);
        UIGraphicsEndImageContext();
    
    return sharedMask;

它返回带有反射的图像。

【讨论】:

什么是 [[self class]gradientMask] ?上面的代码会返回什么?反射图像或整个(原始 + 反射)图像? 在答案中添加了 gradientMask 方法。 imageWithReflectionWithScale 返回原始+反射,reflectedImageWithScale 只返回反射。 如何改变反射图像的高度?我想将原始图像绘制为视图的一半,另一半应该是下面的反射图像。此外,即使我将反射图像的 alfa 值设置为 1,它也会在底部显示不透明的图像。 对于半尺寸,您必须将反射比例设置为 0.5f。如果您不希望反射图像上的渐变,可以将反射Alpha 设置为 1.0f 并注释 CGContextClipToMask(context, bounds, [[self class] gradientMask]);在 reflectImageWithScale 方法上【参考方案2】:

我写了一个blog post awhile ago,它使用了视图的 CAReplicatorLayer。它确实是为处理具有反射的视图的动态更新而设计的,但我认为它也适用于您想要做的事情。

【讨论】:

【参考方案3】:

您可以在图形上下文中渲染图像及其反射,然后从上下文中获取CGImage,然后再从该上下文中获取UIImage。 但问题是:为什么不使用两个视图呢?为什么你会认为这是一个问题或限制?

【讨论】:

以上是关于没有 UIImageView 的 UIImage 的反射的主要内容,如果未能解决你的问题,请参考以下文章

避免在UIImageView中拉伸UIImage

UIImage 不应在 UIImageView 内拉伸

UIImageView 的 UIImage 为 nil

UITableViewCell 内的 UIImageView 没有得到更新

如何在 iOS 中在没有 UIImageView 的情况下在视图上绘制/绘制 UIIMage

如何在 UIImageView 中显示 UIImage?