iOS 使用矢量图
更多图片处理方法见图片组件 BBWebImage
iOS 使用矢量图
iOS 图标通常用 PNG 格式的图片。PNG 图片放大到超过自身的大小就会模糊。可以使用 PDF 格式的矢量图,优点是任意改变图片大小并且保持清晰度。
简单使用
与 PNG 格式的图片一样,在 Xcode 中把 PDF 格式的矢量图拖进 *.xcassets (默认是 Assets.xcassets) 文件夹中,然后用不带后缀(.pdf)的文件名生成 UIImage
imageView.image = [UIImage imageNamed:@"Vector"];
注意,如果以上代码用 "Vector.pdf",无法得到 UIImage。
这样做的话,Xcode 会在编译时根据 PDF 图的大小生成 @1x、@2x、@3x 的 PNG 图片,与使用 PNG 图片的显示效果相同。如果把图片放大到超过 PNG 图片的大小,则会显示模糊的图片。没有发挥矢量图可以任意调整大小的优点。
改变矢量图大小
如果需要改变矢量图大小并且保持清晰度,那就要解析 PDF 源文件,把矢量图绘制成所需大小的位图(Bitmap)。YHPDFImageLoader 库就实现了这个功能,并且可以选择拉伸图片时是否保持原图宽高比,还添加了内存和磁盘缓存。解析 PDF 并绘制位图的代码在 YHPDFImageDraw.m 文件的 drawImageWithURL:size:canStretched:page: 方法中。但是那些代码有 bug,在保持原图宽高比的时候,绘制出的位图不居中。这里参照那些代码,写了 UIImage 的 Category,用于解析 PDF 源文件,绘制指定大小的位图;可以选择拉伸图片时是否保持原图宽高比;拉伸时保持图片居中。注意,这里的 PDF 文件放在工程目录中,与 *.m、*.h 文件一样,不能放在 *.xcassets 里。
#import "UIImage+Vector.h"
@implementation UIImage (Vector)
+ (UIImage *)vectorImageWithName:(NSString *)name size:(CGSize)size {
// 默认保持原图宽高比
return [self vectorImageWithName:name size:size stretch:NO];
}
+ (UIImage *)vectorImageWithName:(NSString *)name size:(CGSize)size stretch:(BOOL)stretch {
// PDF 文件路径
NSString *path = [NSBundle.mainBundle pathForResource:name ofType:@"pdf"];
NSAssert(path, @"Vector image file path should NOT be nil");
if (!path) return nil;
return [self vectorImageWithURL:[NSURL fileURLWithPath:path] size:size stretch:stretch page:1];
}
// url: PDF 文件 URL
// size: 所需绘制图片大小;如果需要绘制原图大小,用 CGSizeZero
// stretch: 是否拉伸;YES,拉伸图片,忽略原图宽高比;NO,保持原图宽高比
+ (UIImage *)vectorImageWithURL:(NSURL *)url size:(CGSize)size stretch:(BOOL)stretch page:(NSUInteger)page {
CGFloat screenScale = UIScreen.mainScreen.scale;
// PDF 源文件
CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithURL((__bridge CFURLRef)url);
// PDF 中的一页
CGPDFPageRef imagePage = CGPDFDocumentGetPage(pdfRef, page);
// PDF 这一页显示出来的 CGRect
CGRect pdfRect = CGPDFPageGetBoxRect(imagePage, kCGPDFCropBox);
// 传入的大小如果为零,使用 PDF 原图大小
CGSize contextSize = (size.width <= 0 || size.height <= 0) ? pdfRect.size : size;
// RGB 颜色空间
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// 位图上下文
CGContextRef context = CGBitmapContextCreate(NULL,
contextSize.width * screenScale,
contextSize.height * screenScale,
8,
0,
colorSpace,
kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
// 坐标缩放,增加清晰度
CGContextScaleCTM(context, screenScale, screenScale);
if (size.width > 0 && size.height > 0) {
// 指定图片大小,需要缩放图片
// 计算宽高缩放比
CGFloat widthScale = size.width / pdfRect.size.width;
CGFloat heightScale = size.height / pdfRect.size.height;
if (!stretch) {
// 保持原图宽高比,使用宽高缩放比中的最小值
heightScale = MIN(widthScale, heightScale);
widthScale = heightScale;
// 坐标平移,使图片居中
CGFloat currentRatio = size.width / size.height;
CGFloat realRatio = pdfRect.size.width / pdfRect.size.height;
if (currentRatio < realRatio) {
CGContextTranslateCTM(context, 0, (size.height - size.width / realRatio) / 2);
} else {
CGContextTranslateCTM(context, (size.width - size.height * realRatio) / 2, 0);
}
}
// 用以上宽高缩放比缩放坐标
CGContextScaleCTM(context, widthScale, heightScale);
} else {
// 使用原图大小
// 获取原图坐标转换矩阵,用于位图上下文
CGAffineTransform drawingTransform = CGPDFPageGetDrawingTransform(imagePage, kCGPDFCropBox, pdfRect, 0, true);
CGContextConcatCTM(context, drawingTransform);
}
// 把 PDF 中的一页绘制到位图
CGContextDrawPDFPage(context, imagePage);
CGPDFDocumentRelease(pdfRef);
// 创建 UIImage
CGImageRef image = CGBitmapContextCreateImage(context);
UIImage *pdfImage = [[UIImage alloc] initWithCGImage:image scale:screenScale orientation:UIImageOrientationUp];
// 释放资源
CGImageRelease(image);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return pdfImage;
}
@end
使用方法
// 保持原图宽高比
imageView.image = [UIImage vectorImageWithName:@"Vector" size:CGSizeMake(50, 50)];
// 拉伸图片,忽略原图宽高比
imageView.image = [UIImage vectorImageWithName:@"Vector"
size:CGSizeMake(50, 50)
stretch:YES];
参考
http://lugede.cn/ios-use-vector-pdf-image
https://github.com/jiisd/YHPDFImageLoader
转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/7307554.html
iOS 使用矢量图的更多相关文章
- iOS 矢量图pdf替换2倍3倍图
一.在开发中矢量图的使用大大提高设计的切图效率! ios 中可以用pdf替换现在的2倍3倍图(1倍图已经忽略) 1.将pdf矢量图拖进工程Assets.xcassets中 2.按照步骤操作 3.矢量图 ...
- iOS - 如何切图适配各种机型
关于iPhone6/6+适配问题一直有争议,今天小编专门为大家整理了相关的有效方案,希望对大伙儿有帮助! 移动app开发中多种设备尺寸适配问题,过去只属于Android阵营的头疼事儿,只是很多设计师选 ...
- 在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)
在 Xcode 6 中使用矢量图( iPhone 6 置配 UI) (本文转载:http://iosdeveloper.diandian.com/post/2014-09-25/40063062789 ...
- iconfont.cn阿里巴巴矢量图下载字体图标实战
1.阿里巴巴矢量图网址:www.iconfont.cn 2.然后用新浪微博账号登录 3.输入要查找的图标相应的关键字,回车 4.滑过要找的图标,点击购物车,让图标存储到暂存架中 5.点击暂存架,存储为 ...
- 在xcode6中使用矢量图(iPhone6置配UI)
转载出处:http://blog.xoneday.com ios应用程序是一个图像主导的产品.在开发一个应用程序时,你需要各种尺寸的图标,你需要为每个图像文件制作一个@1x尺寸和一个@2x尺寸.这样你 ...
- (转)iOS 对矢量图片的支持如何?
简单说,iOS 支持矢量图片,不过支持的一般.在系统层面上,iOS 对矢量绘图支持得很好.iOS 的 Core Graphics 框架带有很多矢量绘图命令,简单一些的直线.矩形.椭圆,复杂一些的贝赛尔 ...
- PaintCode 教程:矢量图轻松转换成CoreGraphics代码
本文译自Ranwenderlich的这篇:http://www.raywenderlich.com/100281/paintcode-for-designers-getting-started Pai ...
- 将阿里矢量图添加到element-ui
在阿里矢量图的操作 选择需要的图标添加至购物车 选择图标 将购物车中的图标, 添加至项目 添加至项目 会自动跳转到我的项目 项目页面 在 更多操作 中选择 编辑项目 更多操作 将 Fo ...
- 矢量图绘制工具Svg-edit调整画布的大小
矢量图绘制工具Svg-edit调整画布的大小 ------------------------------ ------------------------
随机推荐
- 17089 最大m子段和
17089 最大m子段和 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description "最大m子段和 ...
- 百度云BCC配置Apache VirtualHost 实现相同域名不同端口访问不同应用
问题描述:前戏:本人在百度云上购买了BCC虚拟服务,并购买域名,部署应用,可以正常访问(这里一切都很正常^_^). 事情正在起变化:随着开发的不断推进,工程在本地测试成功后,部署到服务器,会发现有些页 ...
- SLAM入门之视觉里程计(2):两视图对极约束 基础矩阵
在上篇相机模型中介绍了图像的成像过程,场景中的三维点通过"小孔"映射到二维的图像平面,可以使用下面公式描述: \[ x = MX \]其中,\(c\)是图像中的像点,\(M\)是一 ...
- Wincc flexable的画面浏览切换组态
1.新建项目和6个画面 2.双击导航控件设置,选择默认设置 3.使用画面浏览编辑器编辑画面层次切换关系,拖拽画面到编辑器中进行关系连接 4.保运并运行
- ArcGIS API for JavaScript 4.2学习笔记[31] (补充学习)Task类
Task这个东西很有用,是AJS中用于解决各种乱七八糟任务的一个类.它有很多子类,有用于空间分析的,有用于空间查询的,等等. 这篇作为补充学习的第一篇,也是进阶学习的第一篇,我就改个写法. 我将使用思 ...
- .NET使用DAO.NET实体类模型操作数据库
一.新建项目 打开vs2017,新建一个项目,命名为orm1 二.新建数据库 打开 SqlServer数据库,新建数据库 orm1,并新建表 student . 三.新建 ADO.NET 实体数据模型 ...
- java操作时间,将当前时间减一年,减一天,减一个月
在Java中操作时间的时候,常常遇到求一段时间内的某些值,或者计算一段时间之间的天数 Date date = new Date();//获取当前时间 Calendar calendar = Calen ...
- Linux发行版 CentOS6.5 修改默认主机名
修改前准备 我们将主机名修改为comexchan.cnblogs.com(本文发布于http://comexchan.cnblogs.com/) 备份相关配置文件,以便回滚 cp /etc/sysco ...
- Sublime Text 使用教程
Sublime Text 是一款非常轻量级而且功能十分强大的编辑器,支持大量插件,深受前端开发者的喜爱.多的不说,我们直接进入正题. 1.下载 ①.官网下载地址:http://www.sublimet ...
- Anaconda系统中管理程序包(Package)
列出所有已安装的程序包 conda list 在已安装的程序包中查找某个特定的程序包 conda search package-name 安装程序包 conda install beautiful-s ...