当前位置:首页 > 技术心得 > 正文内容

获取NSImage图片的准确大小

xjtudll11年前 (2016-01-07)技术心得17420

问题:

NSImage加载图片的时候无法准确获得图片的大小

测试代码:

NSImage *image = [NSImage imageNamed:@"image"];

NSLog(@"%f, %f", image.size.width, image.size.height);

//终端Log到的图片的尺寸是:185.250000, 106.500000,而实际的大小是274.0, 142.0。

//image.size = NSMakeSize(247.0, 142.0); //强制指定尺寸能够解决问题

分析:

用一个Image Well来显示图片的时候,发现图片居然比实际的要小!我试着NSLog图片的大小,发现NSImage加载的图片的size根本就是错的!我根据图片的实际大小,强制设置了图片的尺寸,图片就显示正常了,而且也没有被拉伸的痕迹。这说明图片数据在加载后并没有损耗,只是图片的size属性出错了,因此,强制设置size属性,图片就能正常显示了。

在搜索了一番之后,发现这个问题似乎和图片的DPI有关。如果图片的DPI不是72,NSImage加载图片后size属性就会出错。我在iOS上用同样的方法做了测试,发现UIImage则没有类似的问题。虽然我对图片的DPI的概念也是一知半解,但是,像72 DPI这种应该算是历史的包袱了,毕竟Cocoa是一个非常古老的框架了。

虽然在这里,人肉设置图片大小能够解决问题,不过总不能在以后的代码中都人肉设置每张图片的尺寸吧。总有什么准确的方法来获取图片的真实像素尺寸的。然后就找到了Stack Overflow里的这个问题,解决方法是这样的:// 不要用这个方法,这个方法并不一定总能成功。

NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];

NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);

[image setSize: size];

我试了一下这个方法,确实能够解决我的问题。不过这个方法下面,两个开发人员的对话很有启发,其中一人提到了一个问题,那就是NSImage可能并不存在NSBitmapImageRep--这并不稀奇,比如,用Mac的摄像头拍下的图片就没有!因此,一定有更好的方法。

解决办法:

在Stack Overflow上找到了另一个更加靠谱的方法

NSImage *image = [NSImage imageNamed:@"image"];

NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];

NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);

[image setSize: size];

至此,问题完美解决。不过这个问题提醒了我,不要对Cocoa的内建对象想当然,一定要注意Cocoa框架中的陷阱。这种方法其实在原理上和之前说的那个有缺陷的方法并没有非常本质的不同。只是这种方法是创建了一个NSBitmapImageRep,而不是从图片中获取一个。这样,就不会存在图片对象中无法获取NSBitmapImageRep的问题了。

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://xjtudll.cn/Exp/381/

标签: cocoa
分享给朋友:

“获取NSImage图片的准确大小” 的相关文章

Google地图测距

Google地图测距

百度地图上有个测距功能,还是挺好用的。但百度地图有个缺点,没法看国外的东西,国外地图只显示了国家和首都,信息太匮乏了。 今天要测量欧洲两个城市的直线距离,百度不好使了,Google上默认又没有测距功能,搜了半天,找到了方法。 步骤如下: 1、在浏览器中输入http://ditu.google.cn/...

ML610Q4xx LCD Simulate仿真

ML610Q4xx LCD Simulate仿真

通过DTU8 Debugger和LCD Image Assignment Tool,可以实现LCD仿真,这样可以很方便的调试程序。 如何实现LCD仿真,可以查看《LCD Image Tool User’s Manual》,文件名为:FEXTLcdImgToolU8_UM-07.pdf。这...

运放平衡电阻的作用

运放平衡电阻的作用

运放输入端所接电阻要平衡,目的是使集成运放两输入端的对地直流电阻相等,运放的偏置电流不会产生附加的失调电压。但有些电路对失调电压要求并不高,例如交流音频放大器。有些运放偏置电流很小,即使输入端电阻不平衡也不会对失调电压产生什么影响,这些电路就可以不要求输入端电阻平衡。 以反相放大器来说明平衡电阻的...

运放芯片不用的输入端的处理

本文转载自21IC论坛。 对于数字器件,尤其是CMOS器件,不用的输入端不能悬空,这个道理好像已经尽人皆知了。至少在21IC,时不时就会有人发帖让大家“温习”这个问题。但对于模拟器件,好像认识还有些模糊。 就以运放为例。多运放芯片中不用的运放怎么处理,好像是新手们的一个共同疑问。(有这个疑问是好...

Protel99SE英文版添加汉字

Protel99SE英文版添加汉字

需要使用PCB3.0中文输入程序,操作步骤如下: 双击打开ProtelHz.exe,输入汉字,点击确定。 如果双击ProtelHz.exe没有任何反应,请注意以下几点: ① 程序尽量不要放到较深的目录中,最好在三级以内。 ② 该程序所在的文件夹及所有上级文件夹,文件夹名最好不要使...

Altium导入网表Netlist

Altium导入网表Netlist

用Altium的时候,发现原来Protel99SE里面的通过Netlist更新到PCB的功能不见了。乍一看,似乎只能通过Update来更新PCB了,其实不然,原来通过Netlist更新PCB的功能依然存在,只是难以找到这个功能菜单而已。 在Altium里面,是show difference方式的,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。