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

获取NSImage图片的准确大小

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

问题:

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://www.xjtudll.cn/Exp/381/

标签: cocoa
分享给朋友:

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

固定水晶报表每页显示的行数两种方法

方法一:   例如每页显示20条记录:    1.选择[区段专家]    2.选择[明细]    3.选择[在之前新增分页]的公式按钮,输入以下公司    IF   Remaind...

CC2541  HOGP Android 5.x无法自动回连

CC2541 HOGP Android 5.x无法自动回连

参考资料: https://e2e.ti.com/support/wireless_connectivity/bluetooth_low_energy/f/538/t/406142 问题: 使用CC254x做BLE键盘,利用HOGP(HID Over Gatt Profile),成功实现了键盘的功能...

Quartus II Warning: Found 6 node(s) in clock paths which may be acting as ripple and/or gated clocks

Quartus II编译某代码之后,老是提示如下warning: Warning: Found 6 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buf...

SQL去掉小数点有效数字后的所有0

第一种方法 select cast(2.5000000000000   as  real) select cast(2   as  real) select cast(2.00000   as  r...

Xcode5如何添加或更换图标

Xcode5如何添加或更换图标

参考文献: 官方教程:https://developer.apple.com/library/ios/qa/qa1686/_index.html 1、添加图标图片资源到工程 2、选择对应的App Icons。如果从来没有添加过,【Resource】处可以自己选择想要的图标资源。选择好后编译即可。编...

51单片机内部扩展RAM

51单片机内部扩展RAM

一直想写一篇关于51RAM的文章,网上看到这篇文章,觉得讲的比较详细,我就不献丑了,转载过来了。初学者可以看看。 原文网址:http://www.jhmcu.com/index.php/mcu-internal-expansion-ram-application/ 单片机内部RAM:共256个单元...

发表评论

访客

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