长度属性为图像返回错误的大小(字节)

Posted

技术标签:

【中文标题】长度属性为图像返回错误的大小(字节)【英文标题】:length property returns wrong size(bytes) for an image 【发布时间】:2013-07-15 07:19:24 【问题描述】:

我的资源文件夹中有一个 .png 文件。(实际大小为 411 KB) 当我将 uiimage 转换为 nsdata 并尝试访问 length 属性时,它给了我错误的值。

代码...

UIImage *image = [UIImage imageNamed:@"sample.png"];

NSData *imgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(image, 1.0)];
int imageSize   = imgData.length;
NSLog(@"Image size in KB is %d",imageSize/1024); //-------- returns 631 KB

如果还有其他有用的属性,请告诉我..


所以这是我的要求.... 我想知道我从 uimagepicker 中选择的图像的大小。当我在取景器中看到图像时,它的确切尺寸与从库中选择它后返回给我的尺寸完全不同......还有其他可以用来代替长度的属性吗?

【问题讨论】:

631 Kb 是 imgData 占用的内存量。这与图像在实际文件中的存储方式没有直接关系。如果要获取文件大小,请使用文件系统。 @RobvanderVeer 显然数据长度和文件大小将具有“直接关系”。在这种情况下,它们应该完全相等。也就是说,是否直接从文件中读取数据,而事实并非如此。因此问题。 @matt3141 首先我同意你的答案是正确的。但是文件在这里不仅仅是读入内存,它是被读取和处理的。因此,与文件存储的关系不是“直接的”。 @RobvanderVeer 好的,我们在同一页上。不过,我会说,我很困惑 JPEG 怎么会比 PNG 大得多。 @matt3141,文件更大,因为UIJPEGRepresentation 的第二个参数是1.0;它的压缩系数。 developer.apple.com/library/ios/#documentation/UIKit/Reference/… 【参考方案1】:

您正在将 png 转换为 jpeg,因此应该有不同的文件大小。

如果您希望获得原始 png 图像的文件大小,请执行以下操作。

NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"png"];
NSData *rawData = [NSData dataWithContentsOfFile:path];
NSLog(@"%d", rawData.length);

【讨论】:

为什么不直接问文件系统文件有多大? @HotLicks 我以为发帖者想要的不仅仅是文件大小,否则他可以简单地写int imageSize = 411000;(考虑到捆绑包不可写)【参考方案2】:

试试这个:

unsigned int len = [data length];
uint32_t little = (uint32_t)NSSwapHostIntToLittle(len);
NSData *byteData = [NSData dataWithBytes:&little length:4];

【讨论】:

至少解释一下它的作用。【参考方案3】:

当您加载图像时,您将其解压缩。当您创建“imgData”时,图像没有使用相同的算法重新压缩。没有理由期望两者具有相同的大小。

【讨论】:

以上是关于长度属性为图像返回错误的大小(字节)的主要内容,如果未能解决你的问题,请参考以下文章

获取 UIImage 的大小(字节长度)而不是高度和宽度

将字节数组转换为一定长度的数组段

内存映射文件长度

在js里获取字符串长度

数据库中的一个字段的数据大小不定如何设置字段的长度查询最快又节省空间?

如何发现 std::vector 的大小/长度(以字节为单位)?