zoukankan      html  css  js  c++  java
  • IOS图像处理(7)绘制位图

    UIImage提供了多种方法绘制位图,除了之前用过的drawInRect,我们还可以使用以下方法

    drawAtPoint:需要提供CGPoint指定位图在CGContextRef中的起点

    drawAtPoint:blendMode:alpha:后两个参数指定图片的叠加模式以及透明度

    drawInRect:blendMode:alpha:后两个参数指定图片的叠加模式以及透明度

    此外我们还可以借助Core Graphics中的方法绘制位图

    void CGContextDrawImage(CGContextRef,CGRect,CGImageRef);

    void CGContextDrawTiledImage(CGContextRef,CGRect,CGImageRef);此方法采用平铺模式将图片绘制到rect区域中

    如果需要获得已有图片的全部或者部分,可以使用以下方法

    CGImageRef CGImageCreateCopy(CGImageRef);

    CGImageRef CGImageCreateWithImageInRect(CGImageRef,CGRect);

    我们可以通过绘制位图给图片添加水印

    @implementation ZLTView {
        UIImage *_image;
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            [self drawImage];
            
        }
        return self;
    }
    
    - (void)drawImage {
        UIGraphicsBeginImageContext(self.frame.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        CGContextSaveGState(context);
        
        //Core Graphics中坐标系的坐标原点在屏幕左下角,正方形沿y轴向上,与UIKit相反,因此使用Core Graphic的函数直接绘制会得到y轴相反的图像
        //首先y轴缩放-1,相当于沿着x张旋转180
        CGContextScaleCTM(context, 1, -1);
        //y轴进行平移,使原点移动到左上角
        CGContextTranslateCTM(context, 0, -self.frame.size.height);
        CGContextDrawImage(context, self.frame, [UIImage imageNamed:@"girl.jpg"].CGImage);
        
        //回复之前的绘图环境
        CGContextRestoreGState(context);
        
        //使用UIKit进行绘图不需要变换举证,因为UIKit进行了处理
        [@"made by zlt" drawAtPoint:CGPointMake(0, self.frame.size.height - 40) withAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor],NSFontAttributeName:[UIFont fontWithName:@"Arial" size:25]}];
        
        _image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
    }
    
    - (void)drawRect:(CGRect)rect{
        [_image drawAtPoint:CGPointZero];
    }

    下面例子为UIImage创建了一个分类,具体功能如下

    +(UIImage *)captureView:(UIView *)targetView;      //获得UIView的截屏

    +(UIImage *)captureScreent;                 //获得屏幕截屏 

    -(UIImage *)imageAtRect:(CGRect)rect;           //获取已有的UIImage的一部分 

    -(UIImage *)imageAspectByMinSize:(CGSize)targerSize;  //根据提供的区域短边对UIImage按比例缩放

    -(UIImage *)imageAspectByMaxSize:(CGSize)targerSize;   //根据提供区域的长边对UIImage按比例缩放

    -(UIImage *)imageRotate:(CGFloat)radians;         //对UIImage进行旋转

    +(UIImage *)captureView:(UIView *)targetView {
        UIGraphicsBeginImageContext(targetView.frame.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [targetView.layer renderInContext:context];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    
    +(UIImage *)captureScreent {
        //私有函数,也可以截取根UIView
        extern CGImageRef UIGetScreenImage();
        UIImage *image = [UIImage imageWithCGImage:UIGetScreenImage()];
        return image;
    }
    
    -(UIImage *)imageAtRect:(CGRect)rect {
        CGImageRef imgRef = CGImageCreateWithImageInRect([self CGImage], rect);
        UIImage *image = [UIImage imageWithCGImage:imgRef];
        return image;
    }
    
    -(UIImage *)imageAspectByMinSize:(CGSize)targerSize {
        
        if (!CGSizeEqualToSize(self.size, targerSize)) {
            CGFloat xfactor = targerSize.width / self.size.width;
            CGFloat yfacotr = targerSize.height / self.size.height;
            CGFloat factor = xfactor < yfacotr ? xfactor : yfacotr;
            
            CGFloat nWidth = self.size.width * factor;
            CGFloat nHeight = self.size.height * factor;
            
        
            CGRect rect;
            if (xfactor < yfacotr) {
                
                rect = CGRectMake(0, (targerSize.height - nHeight) / 2, nWidth, nHeight);
            } else {
                rect = CGRectMake((targerSize.width - nWidth) / 2, 0, nWidth, nHeight);
            }
            
            
            UIGraphicsBeginImageContext(targerSize);
            [self drawInRect:rect];
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return image;
            
        }
        
        return self;
    }
    
    
    -(UIImage *)imageAspectByMaxSize:(CGSize)targerSize {
        
        if (!CGSizeEqualToSize(self.size,targerSize)) {
            CGFloat xfactor = targerSize.width / self.size.width;
            CGFloat yfactor = targerSize.height / self.size.height;
            
            CGFloat factor = xfactor > yfactor ? xfactor : yfactor;
            
            CGFloat nWidth = self.size.width * factor;
            CGFloat nHeight = self.size.height * factor;
            
            
            CGRect rect = CGRectZero;
            if (xfactor > yfactor) {
                rect = CGRectMake(0, -(nHeight - targerSize.height)/2, nWidth, nHeight);
                
            } else {
                rect = CGRectMake(-(nWidth - targerSize.width)/2, 0, nWidth, nHeight);
            }
            
            UIGraphicsBeginImageContext(targerSize);
            [self drawInRect:rect];
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return image;
        }
        
        return self;
    }
    
    -(UIImage *)imageRotate:(CGFloat)radians {
        
        //获取旋转后的矩形区域
        CGRect rect = CGRectApplyAffineTransform(CGRectMake(0, 0, self.size.width, self.size.height), CGAffineTransformMakeRotation(radians));
        
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        //将坐标中心移到图片中心,是图片绕中心旋转
        CGContextTranslateCTM(context, rect.size.width/2, rect.size.height/2);
        CGContextRotateCTM(context, radians);
        CGContextScaleCTM(context, 1, -1);
        CGContextDrawImage(context, CGRectMake(-rect.size.width/2, -rect.size.height/2, rect.size.width, rect.size.height), self.CGImage);
        
        UIImage *nImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        
        
        return nImage;
    }
  • 相关阅读:
    ASP.NET中如何防范SQL注入式攻击?(转)
    打开D盘时速度奇慢?
    Visual Studio 2008 下载地址
    如何利用XML文件,做为配置参数?
    如何将一个表中的数据INSERT INTO 到另一个表中?
    拖延交货或惹万人诉讼 消费者称戴尔态度恶劣
    NHibernate Linq中Null值排序的解决方法
    NHibernate3剖析:Query篇之NHibernate.Linq标准查询
    Nhibernate出现No row with the given identifier exists问题的产生原因及解决方法
    Nhibernate使用动态Expression的问题解决
  • 原文地址:https://www.cnblogs.com/zanglitao/p/4037163.html
Copyright © 2011-2022 走看看