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;
}
时间: 2024-08-24 16:12:43

IOS图像处理(7)绘制位图的相关文章

iOS图像处理之绘制直线

-(void)drawLine:(CGPoint)fromPnt toPoint:(CGPoint)toPnt{ float xScale = theImageView.image.size.width/theImageView.frame.size.width; float yScale = theImageView.image.size.height/theImageView.frame.size.height; UIGraphicsBeginImageContext(theImageVie

详解OS X和iOS图像处理框架Core Image

转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习.虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到 Objective-C和OS X. 这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架. 如果你想跟着本文中的代码学习

IOS 开发:绘制像素到屏幕

像素是如何绘制到屏幕上面的?把数据输出到屏幕的方法有很多,通过调用很多不同的framework和不同的函数.这里我们讲一下这个过程背后的东西.希望能够帮助大家了解什么时候该使用什么API,特别是当遇到性能问题需要调试的时候.当然,我们这里主要讲iOS,但是事实上,很多东西也是可以应用到OSX上面的. Graphics Stack 绘制屏幕的过程中又很多都是不被人了解的.但是一旦像素被绘制到屏幕上面,那么像素就是有3种颜色组成:红绿蓝.这3个颜色单元通过特定的强弱组合形成一个特定的颜色.对于iPh

iOS 图像处理-剪裁图像

解决问题:按照某一长宽比例,剪裁图片的上部和下部,保留中间的内容.当然也可以自定义需要剪裁留下的区域 前提:需要添加Framework:CoreGraphics.framework 代码: - (UIImage*) crop:(UIImage*)theImage{ // Get size of current image CGSize size = [theImage size]; // Create rectangle that represents a cropped image CGFlo

iOS 图像处理 - 图像拼接

解决问题:将两个图像拼接在一起 前提:需要添加Framework:CoreGraphics.framework 源码: - (UIImage *) combine:(UIImage*)leftImage :(UIImage*)rightImage { CGFloat width = leftImage.size.width * 2; CGFloat height = leftImage.size.height; CGSize offScreenSize = CGSizeMake(width, h

iOS 图像处理 - 模糊图像

解决问题:将图像模糊 前提:添加 CoreGraphics.framework 源码: - (UIImage*) blur:(UIImage*)theImage { // create our blurred image CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage]; // setting up G

iOS界面的绘制和渲染

界面的绘制和渲染 UIView是如何到显示的屏幕上的. 这件事要从RunLoop开始,RunLoop是一个60fps的回调,也就是说每16.7ms绘制一次屏幕,也就是我们需要在这个时间内完成view的缓冲区创建,view内容的绘制这些是CPU的工作:然后把缓冲区交给GPU渲染,这里包括了多个View的拼接(Compositing),纹理的渲染(Texture)等等,最后Display到屏幕上.但是如果你在16.7ms内做的事情太多,导致CPU,GPU无法在指定时间内完成指定的工作,那么就会出现卡

Delphi GDI对象之绘制位图

http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难,然而如几次所见到的那样,绘制位图非常容易.TCanvas类具有几种方法绘制位图,最常用的方法是Draw方法,这种方法只是在画布上指定位置绘制位图.用户已经见过几个这样的例子.下面是简短的例子. 1 2 3 4 5 6 7 8 9 procedure TForm1.btn1Click(Sender:

多媒体编程——ios视频图像绘制工具类。

IOS上视频级的图像绘制 ios上的图像绘制常规的是 UIView的drawRect函数,但是这个函数是异步触发,并且由主线程执行.虽然可以通过一定技巧达到主动绘制的效果: 1.传递图像给UIView缓存着. 2.然后调用UIView的setNeedDisplay 改写重绘标志. (以上两步是讲图像丢给UIView,让它自己进行绘制,但是绘制的时机不可控,有时候我们需要它马上绘制,甚至有时候我们需要知道它什么时候绘制完成了,就需要下面两步) 3.在播放线程中调用UIView的 perfromOn