首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

避免在UIImageView中拉伸UIImage

避免在UIImageView中拉伸UIImage的方法

在iOS开发中,有时需要在UIImageView中显示一张UIImage,但可能会遇到图片拉伸的问题。为了避免这种情况,可以尝试以下方法:

1. 使用CGImageRef和CGImageCreate

代码语言:objc
复制
CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, colorSpace, bitmapInfo);
UIImage *compressedImage = [UIImage imageWithCGImage:imageRef];

2. 使用Core Graphics压缩UIImage

代码语言:objc
复制
UIImage *compressedImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

3. 使用Core Image压缩UIImage

代码语言:objc
复制
CIImage *ciImage = [[CIImage alloc] initWithImage:compressedImage];
CIContext *context = [CIContext contextWithOptions:@{ kCIContextWorkingColorSpace: (__bridge id)CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3) }];
CGImageRef compressedImageRef = [context createCGImage:ciImage fromRect:[ciImage extent]];
UIImage *compressedImage2 = [UIImage imageWithCGImage:compressedImageRef];
CGImageRelease(compressedImageRef);

4. 使用ZIP压缩UIImage

代码语言:objc
复制
- (UIImage *)compressImage:(UIImage *)image {
    // 获取图片的CGImageRef
    CGImageRef imageRef = image.CGImage;
    // 获取CGImageRef的尺寸
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    // 释放CGImageRef占用的内存
    CGImageRelease(imageRef);
    
    // 创建压缩后的图片
    UIImage *compressedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    
    // 使用ZIP压缩图片
    CGImageRef zipImageRef = CGImageCreateWithImageInRect(compressedImage.CGImage, CGRectMake(0, 0, width, height));
    if (zipImageRef) {
        // 释放占用的内存
        CGImageRelease(zipImageRef);
        // 把压缩后的图片赋值给原UIImage对象
        UIImage *compressedImage2 = [UIImage imageWithCGImage:zipImageRef];
        CGImageRelease(zipImageRef);
        return compressedImage2;
    }
    
    return compressedImage;
}

以上方法中,第1和第2个方法使用Core Graphics和Core Image API进行压缩,性能较好,但需要引入Core Graphics和Core Image依赖。第3个方法使用Core Image API进行压缩,性能较差,但不需要引入Core Graphics和Core Image依赖。第4个方法使用ZIP库进行压缩,性能最快,但需要引入ZIP库。

可以根据具体需求选择相应的方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS图片(UIImage)拉伸技巧 原

iOS图片拉伸技巧与方法总结 一、了解几个图像拉伸的函数和方法 1、直接拉伸法 简单暴力,却是最最常用的方法,直接将图片设置为ImageView的image属性,图片便会随UIImageView对象的大小做自动拉伸...2、像素点的拉伸 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger...有一点需要注意,这个方法默认使用的拉伸模式是区域复制,比如还是上面的图案,如下代码拉伸:     UIImage * img= [UIImage imageNamed:@"11.png"];     img...    UIImageResizingModeStretch,//进行渐变复制模式拉伸 }; 现在就明了了,我们只需要设置一下模式,就可以实现渐变拉伸了:     UIImage * img= [UIImage...二、拉伸的用武之地 圆角按钮,空心按钮,渐变的背景,内容可变的标签,聊天气泡等等这样的素材APP很可能会多次出现,并且每次出现的尺寸可能还会略微有些差异,如果仅仅依靠美工的素材,恐怕不仅很难达到要求

3.4K20

常用开发技巧系列(三)

警告继续:     Xcode,警告这个东西还是很烦人的!下面简单的说两个消除警告的技巧!     第一:加入你使用SVN或者Git管理代码,这当中你要是删除了一些你创建了又觉得没用的文件。...图片的拉伸处理:     先说一个最常见的我们经常会见到的聊天的时候消息显示框:     我们经常用到拉伸,你经常看到的imageView.image属性,这里面的image是根据imageView...NS_AVAILABLE_IOS(6_0); // the interior is resized according to the resizingMode */ 我们一个一个说说,第一个方法我们经常用到聊天消息框的拉伸...UIImage * image1 = [UIImage imageNamed:@"image"]; UIImageView * imageView1 = [[UIImageView alloc]...* image1 = [UIImage imageNamed:@"image"]; UIImageView * imageView1 = [[UIImageView alloc]initWithImage

73050

iOS设置图片拉伸不变形区域引实现方法结

开发,我们可能会遇到这种情况:设计做了一张图,比如是按钮或文本条的背景,但由于文字长度不一,因此按钮或者文本条大小也会变化,如果直接设为背景,那么势必导致图片被拉伸,如果是整体图片还没什么,但如果是一些特殊的图片...实现方法 iOS提供了简单的方法来设置不被拉伸的区域,是以图片原本大小上对应区域来设置的,方法为: - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets...); 也就是说,我们引言的例子,我们就需要设置距离右边界和下边界一定距离,确保包含打钩部分,使其不被拉伸。...上面的方法第二个参数表示拉伸的模式: UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片 UIImageResizingModeTile...:unHandleImg]; // 处理区域拉伸的图片 UIImageView *handleImg = [[UIImageView alloc] initWithFrame:

1.3K20

【IOS 开发】基本 UI 控件详解 (UISegmentedControl | UIImageView | UIProgressView | UISlider | UIAlertView )

拉伸图片 (1) 可拉伸图片用法 可拉伸图片作用 : 在上述进度条, 设置的 progressImage 和 trackImage 必须是可拉伸图片; (2) 可拉伸图片创建 创建可拉伸图片 : 使用...UIImage 创建 可拉伸图片, 通过 UIEdgeInsets 结构体定义图片拉伸区域; -- UIEdgeInsets 结构体 : 包括 left, top, right, bottom 四个值...定制进度条示例 (1) 相关 API 简介  相关 API 简介 :  -- 创建可拉伸UIImageUIImage * trackImage = [[UIImage imageNamed...//创建 可拉伸的图片, 平铺样式 UIImage * trackImage = [[UIImage imageNamed:@"Snip20151210_139.png"] resizableImageWithCapInsets...//创建 可拉伸的图片, 平铺样式 UIImage * trackImage = [[UIImage imageNamed:@"Snip20151210_139.png"] resizableImageWithCapInsets

2.6K40

Swift-图像的性能优化

的生成是由Core Animation被强制生成一些图片,然后发送到渲染服务器,而不是简单的指向原始指针 这个选项把这些图片渲染成蓝色 复制图片对内存和CPU使用来说都是一项非常昂贵的操作,所以应该尽可能的避免...如果图片显示一个Cell上面,滚出屏幕再滚动回来的时候,图片仍然需要重新被设置,进入屏幕之前还需要一次拉伸操作,这些拉伸的操作是会消耗CPU的计算的。这样的设置多了以后就会严重影响性能。...= UIImage(named: "avatar_default") let imageView01 = UIImageView(frame: CGRect(x: 100, y: 100, width...结果如图所示 事实证明,如果图像尺寸和ImageView尺寸不一致,图像就一定会被拉伸,只要被拉伸,CPU就会工作,如果是cell上,每次cell离开屏幕再回到屏幕的时候,都会对图片进行拉伸处理。...() let image = UIImage(named: "avatar_default") let imageView01 = UIImageView(frame

1.7K70

UIImageView圆角,教你远离cornerRadius

当然这些效果不会直接显示屏幕上,可以使用Instruments的CoreAnimation检测,当然你也可以自己写一个检测帧频的方法。 那如何高效的为UIImageView创建圆角?...修改image为圆角图片 图片进行了切角处理后,将得到的含圆角UIImage通过setImage传给了UIImageView。操作没有触发GPU离屏渲染,过程CPU内完成。...*/ - (void)zy_cornerRadiusWithImage:(UIImage *)image cornerRadius:(CGFloat)cornerRadius rectCornerType...做法的原理是手动画出圆角的image,UIView上增加一层UIImageView,将image赋值给UIImageView。...当然,简单的做法是设计的美工自己做一张带有圆角效果的图片,根据大小拉伸。这样的一个好处是以防美工随意更改圆角的角度?

2.1K40

iOS使用xcode可视化图像编辑功能进行图片拉伸

iOS可视化拉伸图片技巧 一、补充 我的另一篇博客http://my.oschina.net/u/2340880/blog/403996探讨了IOS拉伸图像(UIImage)的几种方法和一些小经验...,这篇是一个补充,再将xcode的另一种可视化拉伸图像的方法的使用介绍给大家。...创建一个AssetCatalogs:xcode中新建一个文件,选择AssetCatalogs,如下: ? 然后我们点开这个包,将图片直接拖入工具区即可: ?...2、使用AssetCatalogs的可视化工具进行图片拉伸 完成了上面的步骤之后,我们可以对管理的图片进行处理,点击右下角的show Slicing按钮,我们就会进入可视化编辑区,如下: ?...3、xib文件UIImage拉伸 xib文件UIImageView,在上面加上图片后,可以设置stretching这个属性: ?

1.5K20

iOS 开发仿网易云音乐歌词海报

设计思路: 解析歌词文件,界面上用UITableView加载 长按界面,将UITableView切换至可编辑状态 将选中的歌词保存 根据歌词的数量UIImageView上动态创建UILabel 将UIImageView...上面我们只是将歌词文件转化为数据存储到了我们的内存,接下来要把这些数据显示给用户,这里我们就要用到UITableView这个强大的控件了....,iOS 5.0之前,我们用此API进行对图片的拉伸: - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight...但这个APIiOS 5之后就被废弃了,在这里我们该用它iOS 6以后新出的API对图进行拉伸: - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets...,于是就把这个思路给pass了;后来经过仔细分析,通过UIImageView添加subView也就是UILabel,然后通过以下代码生成的海报达到的效果令人满意,代码如下: 最终的效果图如下:

58130

图层树和寄宿图 -- iOS Core Animation 系列一

视图层级关系可以互相嵌套,一个视图可以管理它的所有子视图的位置。 iOS,所有的视图都是从UIView这个基类派生出来的。...1.3 平行的层级关系 每个UIView都对应着一个CALayer,视图的职责是创建并管理这个图层,以确保党子视图层级关系添加或者被移除的时候,他们对应的图层也同样的在对应的层级关系树中有相同的操作...因为CGImage和UIImage不一样,它没有拉伸的感念。用UIImage读取图片时,读取了高质量的Retina图片。...这种情况下,最外面的像素会被拉伸。 contentsRect App 中最有趣的地方可以用作 image sprites(图片拼合)。...这是因为我们CALayerDelegate方法,没有对超出边界歪的内容提供绘制支持。 除非创建一个单独的图层,我们平时基本不会用到CALayerDelegate。

1.2K20

iOS的GIF动画效果实现

本文选自《iOS动画——核心技术与案例实战》 GIFiOS的使用场景 GIFiOS的使用场景有以下三个方面。 (1)GIF图片分解为单帧图片。 (2)一系列单帧图片合成GIF图片。...(3)获取ImageIO的输出数据:UIImage。 (4)将获取到的UIImage数据存储为JPG或者PNG格式保存到本地。 整个GIF图片分解的过程,ImageIO是处理过程的核心部分。...通过这个方法就可以某种手机分辨率下构建指定方向的图像,当然图像的类型是UIImage类型。...第2行到第5行通过for循环将67张图片依次加载到当前数组。第6行实例化一个UIImageView实例对象。...第7行和第8行设置UIImageView实例对象的frame位置属性以及图片的拉伸方式,这里设置为居中显示。第9行将UIImageView添加到self.view图层上。

1.2K20

iOS 应用瘦身方法思路整理

调研过程我们还发现,应用的体积与图片资源的数量密切相关(听起来好像是废话)。...使用字体文件会避免这个问题,而且不必导入 @2x 和 @3x 图片,一套字体文件就能保证 UI 的清晰度。...framework 可以存放资源,但是 .a 却不可以,因此生成 .a 的 pod 下的资源会被转移到 main bundle 下,这为资源冲突造成了隐患,为了避免这种冲突我们之前采用的使用 bundle...换句话说如何才能低成本的将现在项目中的图片放到特定 bundle下的 Assets.car 文件呢? 对此我们提出了一个解决方案: 1. pod 下新建一个空文件夹。...UIImageViewinitWithCoder:的时候设置回调 hook 到的 decodeObjectForKey: 方法中将图片名称回传给 initWithDecoder: 方法: ?

1K10

Objective-C实现链式编程语法(DSL)

报错 DSL_image这个东西UIView找不到,为什么是UIView呢?明明我们创建的是一个UIImageView。...原因很简单,因为我们的DSL_frame是UIView的category声明并实现的,更要命的是,UIView(DSL)声明的DSL_frame这个方法返回的block的返回值是一个UIView对象...: - (UIView* (^)(CGRect))DSL_frame;, 针对于这个问题,目前笔者只想到一种解决方法:把UIView(DSL)声明的方法拷贝一份到UIImageView(DSL)....最终的UIImageView(DSL)头文件 如下: @interface UIImageView (DSL) #pragma mark - UIView /// 这些是UIView(DSL)拷贝过来的方法...(UIColor *))DSL_TintColor; @end 而UIImageView(DSL).m实现文件不需要再实现DSL_frame和DSL_backgroundColor这两个方法,因为已经

8.1K20

AlamofireImage 源码阅读

UI控件设置图片的方法,我挑其中一个来详解AlamofireImage是怎样将图片加载到视图上的 // 该方法是UIImageView的一个扩展方法,其它控件的扩展方法都差不多一样 public func...(多个view同时加载同一张图片的情况) // 注:ImageDownloaderresponseHandlers属性,存储正在下载的请求,以防止相同的请求多次发出,...,如果有则返回图片 2.NSURLCache获取缓存(内存缓存+磁盘缓存),如果有则返回图片 3.开始网络下载图片,成功后返回图片 4.缓存图片 5.检查是否使用滤镜、加载动画等加载图片 二...return { image in return image.af_imageScaled(to: self.size) } } } /// 拉伸适应...return { image in return image.af_imageAspectScaled(toFit: self.size) } } } /// 拉伸铺满

1.5K60

《Motion Design for iOS》(三十六)

这里是添加动画前的样子。 但等一下,我们并不想要在第一次进入的看到这样的界面。这次练习的目的在于让每个元素都动画到它们的位置上,也就是说它们不应该立即出现在它们的最终位置。...持续时间是动画完成需要的时间,而阻尼是iOS 7UIView动画方法中提供的一个弹簧属性,用来控制弹簧的弹力。...iOS 7的基于block的动画中的damping值实际上是一个解释值,这意味着苹果无论获取到你输入的什么值,都会做一些复杂的计算来操作这个值并将其放入弹簧动作方程式。...而在实际的弹簧动作方程,动作的时间(它到达平衡点或者最终位置的时间)是由弹簧的其他属性决定的,它不是你去设置然后强制弹簧遵循的。...苹果的动画方法有一个你需要设置的持续时间,所以你以一种并非完全遵循物理法则管理下的弹簧动作。

51220

【译】如何避免JavaScript阻塞DOM

原文链接:https://www.sitepoint.com/avoiding-dom-blocking/ 浏览器和在诸如Node.js的运行时环境,JavaScript程序是运行在单线程上的。...例如:当一个按钮被点击后触发了一个事件,这个事件执行一个函数,函数内进行了一些计算并更新DOM。一旦完成,浏览器便空闲下来,从任务队列取出下一个任务来处理。...默认设置下,前面的例子“入侵者”通过改变left-margin来移动。这个属性及相似的属性如left和width会导致动画的每一步浏览器都需要对整个页面文档进行回流和重绘。...一个好的折衷办法是使用内存的对象来提高性能,然后合适的时机对数据进行持久化——例如在卸载页面时: // get previously-saved data var store = JSON.parse...此外,幸运的是,无法避免长时间运行任务的情况下,也存在一些选项可供开发者选择。 用户和客户们可能永远不会注意到你所做的速度优化,但当应用程序变慢时,他们总是会抱怨!

2.7K10
领券