UIImage.size的坑

有的时候,我们做一些图片的操作。会用到UIImage.size.width,和UIImage.size.height作为宽高进行计算。

然而会出现一些意想不到的情况。比如下面这个例子:

clothing.png 510*628

代码:

UIImage *image = [UIImage imageNamed:@"clothing.png"];
UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:[UIScreen mainScreen].scale orientation:image.imageOrientation];
CGImageRef imageref = CGImageCreateWithImageInRect([scaledImage CGImage], CGRectMake(0, 0, scaledImage.size.width, scaledImage.size.height));
self.imageview2.image = [UIImage imageWithCGImage:imageref];

在iphone6p上运行这段代码,然后imageview2显示的内容是下面这个样子:

只显示出了左上角的一小部分。

why???

通过这个代码,你可能一下就能意识到问题在哪,就是因为这段代码:

UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:[UIScreen mainScreen].scale orientation:image.imageOrientation];

这里传递的scale是当前手机屏幕的点分辨率,iphone6p是3,所以这样得到的UIImage的size的width和height其实都是真实大小除以3。

我们查看UIImage的size属性官方文档也说了:

This value reflects the logical size of the image and takes the image’s current orientation into account. Multiply the size values by the value in the scale property to get the pixel dimensions of the image.

size是逻辑大小,真实的bitmap大小要用UIImage.size.width * UIImage.scale以及 UIImage.size.height * UIImage.scale。

或者直接使用bitmap的宽高:

CGFloat rwidth = CGImageGetWidth([scaledImage CGImage]);
CGFloat rheight = CGImageGetWidth([scaledImage CGImage]);

这里,我们直接看到UIImage的创建方式是initWithCGImage并且传递了scale为3,所以能够知道width和height是不准确的,但是实际应用中,你拿到一个UIImage,可能来自别人的模块,可能来自第三方库(比如SDWebImage)。所以如果需要使用UIImage的bitmap大小(也就是真实大小)的时候,并且不确定该UIImage是怎么创建的,一定要使用以下两种方式:

image.size.width * image.scale
image.size.height * image.scale

以及

CGFloat rwidth = CGImageGetWidth([scaledImage CGImage]);
CGFloat rheight = CGImageGetWidth([scaledImage CGImage]);
时间: 2024-10-30 06:01:20

UIImage.size的坑的相关文章

我所理解的内存分配算法(一)

内存分配从本质上来说是一种空间管理算法,给你一块连续的空间,提供存储服务,那么你的空间管理跟分配要采用什么样的算法才会比较高效? Bump-the-Pointer Bump-the-Pointer是最简单的算法.HotSpot的MM白皮书是这么描述btp的, That is, the end of the previously allocated object is always kept track of. When a new allocation request needs to be s

swiftTools

String+Exten.swift // // String+Exten.swift // swiftTest // // Created by napiao on 15/11/27. // Copyright © 2015年 JINMARONG. All rights reserved. // import Foundation import CoreLocation extension String { /// 将字符串转换成经纬度 func stringToCLLocationCoord

Swift开发中常用的一些图片处理方法

//MARK: - 生成指定尺寸的纯色图片 func imageWithColor(color: UIColor!, size: CGSize) -> UIImage{ var size = size if CGSizeEqualToSize(size, CGSizeZero){ size = CGSizeMake(1, 1) } let rect = CGRectMake(0, 0, size.width, size.height) UIGraphicsBeginImageContext(re

分布式框架-日志系统思路及实现

转自:https://www.jianshu.com/p/ce30c31111ca 背景 随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式应用和服务化应用开始走进大家的视野,但是分布式的部署也会带来另外的问题,日志分散在各个应用服务节点中,出现问题不方便及时排查,尤其是服务化的应用中,分析问题时可能需要查看多个日志文件才能定位问题,如果相关项目不是一个团队维护时沟通成本更是直线上升,怎么将日志文件归集,怎么将日志文件呈现成了很多公司需要面对的问题,因此日志系

Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)

0.踩坑背景 执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似"北京天安门"-->"5 10 88 32 111",方便后面的计算. 这个函数会利用一个全局的类似HashMap的table,hashmap中的key是character(char),value是id(int),涉及到一个从hashmap中按照key取值的操作,代码如

iOS 将一个UIImage缩放到指定Size

这方法挺实用的,直接调用就可以得到想要的size. //将一个UIImage缩放变换到指定Size -(UIImage*) OriginImage:(UIImage *)image scaleToSize:(CGSize)size { UIGraphicsBeginImageContext(size); [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage* scaledImage = UIGraphicsGe

开发ionic + cordova应用时遇到的坑,resources/splash.png do not meet minimum size requirements: 2732x2732

项目是早就创建好了(新创建的项目一般不会遇到这个问题), 在我添加平台时(ionic cordova platform add android) 报了以下错误: [cordova-res] WARN: Error with source file resources/splash.png: The dimensions for source image of type "splash" do not meet minimum size requirements: 2732x2732 (

踩坑 Uncaught RangeError: Maximum call stack size exceeded

今天遇到了一个错误, 堆栈溢出,很好奇就是一个简单ajax请求怎么会报这个错误,研究了一下,发现犯了一个很低级的错误,data的参数错误了: passWord是未定义的变量,值为空,然后导致了这个问题. 原文地址:https://www.cnblogs.com/ryanzheng/p/10367513.html

WKWebView 那些坑

导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷新率.和 safari 相同的 JavaScript 引擎等优势. 简单的适配方法本文不再赘述,主要来说说适配 WKWebView 过程中填过的坑以及善待解决的技术难题. 1.WKWebView 白屏问题 WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebView 是一