CGContext 总结
来源:互联网 发布:淘宝全部订单显示不全 编辑:程序博客网 时间:2024/04/29 21:50
CGContext 总结
1.画图获取context
1.1 从drawRect:函数构造context
- (void)drawRect:(CGRect)rect { // Drawing code CGContextRef ref = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(ref, [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5].CGColor); CGContextFillRect(ref, CGRectMake(0, 0, 300, 400)); CGContextSetStrokeColorWithColor(ref, [UIColor blueColor].CGColor); CGContextAddEllipseInRect(ref, CGRectMake(0, 30, 100, 100)); CGContextMoveToPoint(ref, 50, 80); CGContextAddLineToPoint(ref, 200, 250); CGContextStrokePath(ref); CGContextRelease(ref);//context需要自己释放,CGImageRef也需自己释放}
1.2 由UIGraphicsBeginImageContex或UIGraphicsBeginImageContextWithOptions获取context或CGBitmapContextCreate,不同之处在于前两者的context坐标系原点在左下角,后者在左上角。
- (CGContextRef)myCGContextRef{// CGContextRef ref = [self makeBitmapContextWithPixelWidth:400 height:300]; UIGraphicsBeginImageContext(CGSizeMake(400, 300)); //UIGraphicsBeginImageContextWithOptions(CGSizeMake(400, 300), NO, 1.0); CGContextRef ref = UIGraphicsGetCurrentContext(); return ref;}- (CGContextRef)makeBitmapContextWithPixelWidth:(NSInteger)width height:(NSInteger)height{ NSInteger bitPerComponent = 8; NSInteger bytesPerRow = width * 4 * bitPerComponent; CGContextRef bitmapContextRef = CGBitmapContextCreate(NULL, width, height, bitPerComponent, bytesPerRow, CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), kCGImageAlphaPremultipliedLast); //第二种方式 /* CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], rect); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef); CGContextRef bitmap = CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); */ return bitmapContextRef;}
UIGraphicsBeginImageContex或UIGraphicsBeginImageContextWithOptions获取context或CGBitmapContextCreate,不同之处在于前两者的context坐标系原点在左下角,后者在左上角。drawRect中的context是UIView自动生成返回的,坐标系原点在左上角
对以下2情况,CGContext坐标系在左上角:
1) In iOS, a drawing context returned by an UIView.(如drawRect中context)
2) In iOS, a drawing context created by calling the UIGraphicsBeginImageContextWithOptions function.
context坐标系在左上角
context坐标系在左下角
2.画图并获取image
drawRect函数可直接将图画在view上,还有一种方式便是自己画图,获取context中图片,然后将图片传给imageView或其他在view上展示出来
- (UIImage *)drawImage{ CGContextRef ref = [self myCGContextRef]; //用现有的image直接draw UIImage *originImage = [UIImage imageNamed:@"D.jpg"]; UIImage *newImage = [UIImage imageWithCGImage:originImage.CGImage scale:1.0 orientation:UIImageOrientationRight]; CGContextDrawImage(ref, CGRectMake(0, 0, 300, 400), newImage.CGImage);// [newImage drawInRect:CGRectMake(0, 0, 400, 300)]; //自己画 CGContextSetFillColorWithColor(ref, [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5].CGColor); CGContextFillRect(ref, CGRectMake(0, 0, 300, 400)); CGContextSetStrokeColorWithColor(ref, [UIColor blueColor].CGColor); CGContextAddEllipseInRect(ref, CGRectMake(0, 30, 100, 100)); CGContextMoveToPoint(ref, 50, 100); CGContextAddLineToPoint(ref, 200, 250); CGContextStrokePath(ref); //最后获取context中画的的image,然后传给imageView展示出来 CGImageRef imageRef = CGBitmapContextCreateImage(ref); UIImage *image = [UIImage imageWithCGImage:imageRef]; //需要自己释放 CGImageRelease(imageRef); CGContextRelease(ref); return image;}
需要注意的是,用现有的image直接draw的方式,系统会将image上下翻转(坐标系不翻转)。故对于context坐标系在左下角的情况,图片的方向和我们想要的方向是一致的(UIKit坐标系),对于context坐标系在左上角的情况,图片就是上下翻转的,需要我们自己处理,或者用drawInRect:代替CGContextDrawImage,前者的坐标系是左上角,且要用UIGraphicsBeginImageContex造context,CGBitmapContextCreate造的画不出来。代码一般如下:
//一般此函数是将image方向正为UIImageOrientationUp- (UIImage *)contextImage:(UIImage *)image{ UIGraphicsBeginImageContext(CGSizeMake(_image.size.width, _image.size.height)); //UIGraphicsBeginImageContextWithOptions(CGSizeMake(_image.size.width, _image.size.height), NO, 1.0); [_image drawInRect:CGRectMake(0, 0, _image.size.width, _image.size.height)]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); _image = scaledImage; return scaledImage;}
采用CGContextDrawImage,context坐标系在左下角,因image自己会上下翻转,所以画出来的图是正的
采用CGContextDrawImage,context坐标系在左上角,因image自己会上下翻转,所以画出来的图是上下翻转的
采用drawInRect:,且UIGraphicsBeginImageContex造context,画出来的是正的
- CGContext总结
- CGContext 总结
- CGContext 总结
- CGContext 总结二
- CGContext
- CGContext
- CGContext
- CGContext
- CGContext
- CGContext小记
- CGContext小记
- CGContext小记
- CGContext小记
- CGContext小记
- CGContext 用法
- CGContext小记
- CGContext小记
- CGContext绘图
- 简单东西-java动态更改JLabel背景图片
- react native组件学习(四)
- android中使用xml里的array资源
- 从比特币到区块链的未来
- 设置Hadoop+Hbase集群pid文件存储位置
- CGContext 总结
- 线分平面,空间
- code vs玉蟾宫
- 使用AsyncTask下载图片
- jQuery UI 实例 - 自动完成(Autocomplete)
- 如何对测试对象进行定位
- Html中插入javascript不识别问题
- 接收端的匹配滤波器设置
- trap命令--在脚本中处理信号