`
jsntghf
  • 浏览: 2542528 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

将方图转成圆图

    博客分类:
  • iOS
阅读更多

以前,写过一篇文章:图片圆角显示,这篇文章中的方法,可以将图片的四个角设置成圆角显示,如果将cornerRadius的值设置为图片宽度的一半,显示的则为圆图,本文提供了另一种将方图转成圆图的实现。

 

核心代码如下:

 

- (void)drawRect:(CGRect)rect {
    // Image rect
    CGRect imageRect = CGRectMake((self.borderWidth),
                                  (self.borderWidth),
                                  rect.size.width - (self.borderWidth * 2),
                                  rect.size.height - (self.borderWidth * 2));
    
    // Start working with the mask
    CGColorSpaceRef maskColorSpaceRef = CGColorSpaceCreateDeviceGray();
    CGContextRef mainMaskContextRef = CGBitmapContextCreate(NULL,
                                                            rect.size.width,
                                                            rect.size.height,
                                                            8,
                                                            rect.size.width,
                                                            maskColorSpaceRef,
                                                            0);
    CGContextRef shineMaskContextRef = CGBitmapContextCreate(NULL,
                                                             rect.size.width,
                                                             rect.size.height,
                                                             8,
                                                             rect.size.width,
                                                             maskColorSpaceRef,
                                                             0);
    CGColorSpaceRelease(maskColorSpaceRef);
    CGContextSetFillColorWithColor(mainMaskContextRef, [UIColor blackColor].CGColor);
    CGContextSetFillColorWithColor(shineMaskContextRef, [UIColor blackColor].CGColor);
    CGContextFillRect(mainMaskContextRef, rect);
    CGContextFillRect(shineMaskContextRef, rect);
    CGContextSetFillColorWithColor(mainMaskContextRef, [UIColor whiteColor].CGColor);
    CGContextSetFillColorWithColor(shineMaskContextRef, [UIColor whiteColor].CGColor);
    
    // Create main mask shape
    CGContextMoveToPoint(mainMaskContextRef, 0, 0);
    CGContextAddEllipseInRect(mainMaskContextRef, imageRect);
    CGContextFillPath(mainMaskContextRef);
    // Create shine mask shape
    CGContextTranslateCTM(shineMaskContextRef, -(rect.size.width / 4), rect.size.height / 4 * 3);
    CGContextRotateCTM(shineMaskContextRef, -45.f);
    CGContextMoveToPoint(shineMaskContextRef, 0, 0);
    CGContextFillRect(shineMaskContextRef, CGRectMake(0,
                                                      0,
                                                      rect.size.width / 8 * 5,
                                                      rect.size.height));
    
    CGImageRef mainMaskImageRef = CGBitmapContextCreateImage(mainMaskContextRef);
    CGImageRef shineMaskImageRef = CGBitmapContextCreateImage(shineMaskContextRef);
    CGContextRelease(mainMaskContextRef);
    CGContextRelease(shineMaskContextRef);
    // Done with mask context
    
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextSaveGState(contextRef);
    
    CGImageRef imageRef = CGImageCreateWithMask(self.image.CGImage, mainMaskImageRef);
    
    CGContextTranslateCTM(contextRef, 0, rect.size.height);
    CGContextScaleCTM(contextRef, 1.0, -1.0);
    
    CGContextSaveGState(contextRef);
    
    // Draw image
    CGContextDrawImage(contextRef, rect, imageRef);
    
    CGContextRestoreGState(contextRef);
    CGContextSaveGState(contextRef);
    
    // Clip to shine's mask
    CGContextClipToMask(contextRef, self.bounds, mainMaskImageRef);
    CGContextClipToMask(contextRef, self.bounds, shineMaskImageRef);
    CGContextSetBlendMode(contextRef, kCGBlendModeLighten);
    CGContextDrawLinearGradient(contextRef, [self alphaGradient], CGPointMake(0, 0), CGPointMake(0, self.bounds.size.height), 0);
    
    CGImageRelease(mainMaskImageRef);
    CGImageRelease(shineMaskImageRef);
    CGImageRelease(imageRef);
    // Done with image
    
    CGContextRestoreGState(contextRef);
    
    CGContextSetLineWidth(contextRef, self.borderWidth);
    CGContextSetStrokeColorWithColor(contextRef, self.borderColor.CGColor);
    CGContextMoveToPoint(contextRef, 0, 0);
    CGContextAddEllipseInRect(contextRef, imageRect);
    // Drop shadow
    CGContextSetShadowWithColor(contextRef,
                                self.shadowOffset,
                                self.shadowBlur,
                                self.shadowColor.CGColor);
    CGContextStrokePath(contextRef);
    CGContextRestoreGState(contextRef);
}

 

示例图:


分享到:
评论

相关推荐

    Android 各种图像转换(圆角/圆形/五角星)的转换库 源码

    它提供了多个转换器,如`CircleTransform`用于将方形图片转换为圆形,`RoundedCornersTransform`用于生成具有圆角的图片,以及可能存在的`StarShapeTransform`用于制作五角星形状的图片。这些转换器都是基于像素操作...

    图圆角圆形.zip

    它指的是将一个矩形图像的四个角转换为半圆形或圆形,从而使得整个图像看起来像是一个完整的圆形或者具有圆润边角的方形。这种效果在设计中常用于制作头像、按钮、图标等元素,因为它能够带来更柔和、友好的视觉体验...

    圆检测和方形检测(图像处理)

    对于圆检测,Hough变换可以转换为检测半径和中心坐标。在MFC环境中,你需要创建一个图形界面,让用户能够上传图像,然后在后台运行Hough变换算法。该算法将像素空间中的每个像素映射到一个三维参数空间(两径向和一...

    如何使用GDI+制作圆形图片(类似QQ圆形头像)(MFC,VC)

    在Windows编程领域,GDI+(Graphics Device Interface Plus)是一个强大的图形处理库,它扩展了传统的GDI功能,提供了更多的图形绘制和图像处理能力。在MFC(Microsoft Foundation Classes)框架下,我们可以利用GDI...

    图形的拼组——平面图形的转换.doc

    通过一系列的转换练习,如长方形变换成正方形、正方形变换成三角形,甚至是圆变换成正方形,以及不规则图形向规则图形的转换,学生们能够直观地感受到图形间转化的趣味性和逻辑性。这一过程不仅加深了学生对图形性质...

    图形图像,基本图形,图形动画

    基本图形,色彩填充及使用,屏幕操作, 图形动画,圆形精美图,直线精美图案,心形图案,钻石图案,雪花,直线、正方形综合,图形时钟,火箭发射,跳动的小球,旋转的五角星,变化的同心圆,小球碰撞,鼠标绘图,...

    奥数专题平面图形之圆的面积.doc

    如例题5的两种解法,第一种是直接减去等腰直角三角形的面积,第二种则是通过旋转将图形转换为更易计算的形式。这体现了数学思维的灵活性和创造性。 总的来说,解决这类问题的关键在于理解基本图形的面积公式,熟练...

    圆和扇形的图形讲义.doc

    计算圆的面积时,通常需要将圆转换成已知图形,例如通过将圆分割并拼成近似的长方形来求解。 习题训练中的知识点: 1. 直径是通过圆心且两端都在圆上的线段,半径是从圆心到圆上任意一点的线段。同一圆内,直径等于...

    图片切圆和小角

    "图片切圆和小角"这个主题主要涉及的是如何将方形或矩形的图片转换为具有圆形或带有小角度的形状,通常是为了创建更加吸引人的视觉效果,比如在头像显示、社交网络应用或者卡片式设计中。本文将深入探讨这个过程,并...

    411第2课时从不同的方向看立体图形和立体图形的展开图.ppt

    展开图是指将三维的立体图形展平成二维平面图形的过程,这种转换在工程设计和包装设计等实际应用中极为重要。以正方体为例,学生通过观察正方体的展开过程,学会如何根据立体图形的棱和面的连接方式来判断其展开图的...

    8*8点阵屏 方形图扫描代码及仿真

    在方形图扫描中,可能需要将方形的像素坐标转换为点阵屏上的点位置,再根据位置信息更新74HC595的输出。此外,为了节省CPU资源,可以采用中断或定时器来控制扫描频率,确保图形显示的流畅性。 文件"13方形图扫描...

    iRoundPic圆角方角图片快速制作

    1、快速制作圆角图、倒影图、阴影图、水印图 2、快速裁切图片,自动比例处理 3、转换图片格式、优化压缩图片文件尺寸 4、为图片添加各类样式水印、及其他元素 5、快速桌面、应用程序、摄象头截图直接制作 6、支持...

    一年级数学下册 认识长方形、正方形和圆7教案 苏教版 教案.doc

    练习四4和5鼓励学生探索如何将长方形折成两个相同的三角形或折出正方形,这有助于培养空间想象力和解决问题的能力。练习四6则通过转化思想,将长方形转换为平行四边形,通过剪切和拼接的方式,激发学生的创新思维。 ...

    Excel模板11-多分类圆环图(直角).zip

    3. **直角处理**:通过特殊的设置或插件,将标准的圆环图转换为直角形式,这可能涉及到修改图表类型、编辑轴属性,或者使用第三方工具。 4. **数据可视化技巧**:如何通过有效的颜色选择、标签设计以及图例布局,...

    M与圆有关的组合图形.pdf

    以正方形边长为10cm为例,解题首先要清楚图形的构成,将图形分解成简单图形,如半圆和正方形,通过加减运算求得阴影部分的面积。 组合图形的周长和面积计算方法: 1. 周长计算:明确原图形,找出组成阴影部分的所有...

    pdf图纸转换为dwg格式

    这个工具能够解析PDF中的线条、形状和文本,并将其转换成CAD可识别的DWG文件。标签“pdf2dwg”直接指出了这一转换过程的关键技术。 转换过程通常包括以下步骤: 1. **导入PDF文件**:用户需要选择要转换的PDF图纸,...

    小学数学组合图形面积.docx

    例如,添加一条辅助线,将图形转换为两个相等的三角形。 6. 割补法:将图形的一部分切割下来并补到另一部分,使得图形变成基本图形。如一个弓形切割后补到另一边,使得阴影部分成为正方形的一半。 7. 平移法:将...

    Qt利用Poppler解析pdf成图片

    这篇博客文章的标题"Qt利用Poppler解析pdf成图片"说明了如何结合这两个工具,将PDF文档转换为一系列图像,这在某些应用场景中非常有用,比如网页预览、无PDF阅读器环境下的文档共享等。 首先,我们要理解Qt如何与...

    易语言-(矩形图片转圆形)矩形图片框→圆形图片框→抗锯齿

    在本主题中,我们将深入探讨如何使用易语言将矩形图片转换为圆形图片,并实现抗锯齿效果。 首先,我们要明白的是,易语言的标准图片框控件默认是矩形的,这在设计圆形图片显示时会带来不便。为了解决这个问题,我们...

Global site tag (gtag.js) - Google Analytics