zoukankan      html  css  js  c++  java
  • 一些有关图像处理的代码片段(抓图、倒影、圆角)

    捕捉屏幕截图
    CALayer实例使用Core Graphics的renderInContext方法可以将视图绘制到图像上下文中以便转化为其他UIImage实例。前提先#import <QuartzCore/QuartzCore.h>

    + (UIImage *) imageFromView: (UIView *)theView {
    // draw a view's contents into an image context
    UIGraphicsBeginImageContext(theView.frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    [theView.layer renderInContext:context];
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
    }

    注:UIGraphicsBeginImageContext(CGSize size)创建一个基于位图的上下文(context),并将其设置为当前上下文。函数功能与UIGraphicsBeginImageContextWithOptions相同,相当于该方法的opaque参数为NO,scale因子为1.0。而UIGraphicsEndImageContext()方法是移除栈顶的基于当前位图的图形上下文。

    捕捉截取某个区域内屏幕图像

    - (UIImage *)imageFromView: (UIView *) theView  atFrame:(CGRect)rect
    {
    UIGraphicsBeginImageContext(theView.frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    UIRectClip(rect);
    [theView.layer renderInContext:context];
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return theImage;//[self getImageAreaFromImage:theImage atFrame:rect];
    }

    从某图片中截图

    UIImage *image = [[UIImage alloc] initWithData:data];//大图
    CGRect imageRect = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    CGSize itemSize = CGSizeMake(w,h);
    UIGraphicsBeginImageContext(itemSize);
    [image drawInRect:imageRect];
    UIImage *smallimage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    视图添加倒影效果

    const CGFloat kReflectPercent = -0.25f;
    const CGFloat kReflectOpacity = 0.3f;
    const CGFloat kReflectDistance = 10.0f;

    + (void)addSimpleReflectionToView:(UIView *)theView
    {
    CALayer *reflectionLayer = [CALayer layer];
    reflectionLayer.contents = [theView layer].contents;
    reflectionLayer.opacity = kReflectOpacity;
    reflectionLayer.frame = CGRectMake(0.0f,0.0f,theView.frame.size.width,theView.frame.size.height*kReflectPercent); //倒影层框架设置,其中高度是原视图的百分比
    CATransform3D stransform = CATransform3DMakeScale(1.0f,-1.0f,1.0f);
    CATransform3D transform = CATransform3DTranslate(stransform,0.0f,-(kReflectDistance + theView.frame.size.height),0.0f);
    reflectionLayer.transform = transform;
    reflectionLayer.sublayerTransform = reflectionLayer.transform;
    [[theView layer] addSublayer:reflectionLayer];
    }

     另一:使用Core Graphics创建倒影

    + (CGImageRef) createGradientImage:(CGSize)size
    {
    CGFloat colors[] = {0.0,1.0,1.0,1.0};
    //在灰色设备色彩上建立一渐变
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(nil,size.width,size.height,8,0,colorSpace,kCGImageAlphaNone);
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace,colors,NULL,2);
    CGColorSpaceRelease(colorSpace);

    //绘制线性渐变
    CGPoint p1 = CGPointZero;
    CGPoint p2 = CGPointMake(0,size.height);
    CGContextDrawLinearGradient(context,gradient,p1,p2,kCGGradientDrawsAfterEndLocation);

    //Return the CGImage
    CGImageRef theCGImage = CGBitmapContextCreateImage(context);
    CFRelease(gradient);
    CGContextRelease(context);
    return theCGImage;
    }

    //Create a shrunken frame for the reflection

    + (UIImage *) reflectionOfView:(UIView *)theView WithPercent:(CGFloat) percent
    {
    //Retain the width but shrink the height
    CGSize size = CGSizeMake(theView.frame.size.width, theView.frame.size.height * percent);

    //Shrink the View
    UIGraphicsBeginImageContext(size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [theView.layer renderInContext:context];
    UIImage *partialimg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //build the mask
    CGImageRef mask = [ImageHelper createGradientImage:size];
    CGImageRef ref = CGImageCreateWithMask(partialimg.CGImage,mask);
    UIImage *theImage = [UIImage imageWithCGImage:ref];
    CGImageRelease(ref);
    CGImageRelease(mask);
    return theImage;
    }

    const CGFloat kReflectDistance = 10.0f;
    + (void) addReflectionToView: (UIView *)theView
    {
    theView.clipsToBounds = NO;
    UIImageView *reflection = [[UIImageView alloc] initWithImage:[ImageHelper reflectionOfView:theView withPercent:0.45f]];
    CGRect frame = reflection.frame;
    frame.origin = CGPointMake(0.0f, theView.frame.size.height + kReflectDistance);
    reflection.frame = frame;

    // add the reflection as a simple subview
    [theView addSubView:reflection];
    [reflection release];
    }

    实现圆角图片:

    UIColor *color = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:0];
    [aImage setBackgroundColor:color]; //设置背景透明

    /******设置图片圆角begin*******/
    aImage.layer.masksToBounds = YES;
    aImage.layer.cornerRadius = 5.0;
    aImage.layer.borderWidth = 0.5;
    aImage.layer.borderColor = [[UIColor grayColor] CGColor];
    /******设置图片圆角end********/

    另有方法可见:http://www.4ucode.com/Study/Topic/2058289转载文章。

    实现iPhone图标的水晶立体效果

    - (void)viewDidLoad {
    [super viewDidLoad];
    UIGraphicsBeginImageContext(icon.bounds.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    const CGFloat components[4] = {0.0,0.4,0.0,1.0};
    CGContextSetFillColor(ctx, components);
    CGContextFillRect(ctx, CGRectMake(0, 0, icon.bounds.size.width, icon.bounds.size.height));
    UIImage *background = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImage *image = [UIImage imageNamed:@"icon.png"];
    UIImage *mask = [UIImage imageNamed:@"IconBase.png"];
    UIImage *roundCorner = [UIImage imageNamed:@"round-corner.png"];
    icon.image = image;
    CALayer* subLayer = [[CALayer layer] retain];
    subLayer.frame = icon.bounds;
    subLayer.contents = (id)[background CGImage];
    CALayer* maskLayer = [[CALayer layer] retain];
    maskLayer.frame = icon.bounds;
    maskLayer.contents = (id)[mask CGImage];
    [subLayer setMask:maskLayer];
    [[icon layer] addSublayer:subLayer];
    CALayer* roundCornerLayer = [[CALayer layer] retain];
    roundCornerLayer.frame = icon.bounds;
    roundCornerLayer.contents = (id)[roundCorner CGImage];
    [[icon layer] setMask:roundCornerLayer];
    [maskLayer release];
    [subLayer release];
    [roundCornerLayer release];
    }

    两图合成一图

    - (UIImage*)addImage:(UIImage *)image1 toImage:(UIImage*)image2
    {
    UIGraphicsBeginImageContext(image1.size);

    [image1 drawInRect:CGRectMake(0,0,image1.size.width,image1.size.height)];
    [image2 drawInRect:CGRectMake(0,0,image2.size.width,image2.size.height)];

    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resultingImage;
    }








  • 相关阅读:
    洛谷P2294 [HNOI2005]狡猾的商人
    洛谷P2119 魔法阵
    Navicat中怎样将SQLServer的表复制到MySql中
    Electron中与Vue集成流程
    Electron中通过net的API发出HTTP请求
    Electron中实现菜单、子菜单、以及自带操作事件
    Eclipse中怎样使用ERMaster进行单表设计并导出为DDL
    Eclipse中怎样安装数据库建模工具ERMaster插件
    Eclipse中安装插件时提示:No repository found containing: osgi.bundle,org.eclipse.emf,2.8.0.v20180706-1146
    Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容
  • 原文地址:https://www.cnblogs.com/lovecode/p/2246421.html
Copyright © 2011-2022 走看看