我正在创建一个基于回合的游戏,并使用GameCenter来处理它。在这里,我想在matchData中发送一个小图片/图标进行匹配。这个查询与Game Center无关,但由于Game Center matchData是MAX 64kb,我想知道如何在x * x大小时找出图像可以占用多少空间。我已经测试了几个图标/图像,它们的文件大小非常不同。两个图像,都是128x128像素,一个是13kb,另一个是34kb。我认为他们有不同的“分辨率”或其他东西(每英寸像素数?)以及我猜测某些颜色比其他颜色“更大”,但我想知道如何找出我必须有多大的预期文件是(总是假设最坏的,对吧?)。 我已经制作了裁剪工具,因此图像总是128x128,有没有办法知道128x128图像有多大(以字节为单位)?如果他们有“分辨率”在一百万,我怎么能以编程方式减少它?(注意,我完全不知道这个“分辨率”到底是什么)
白色的RGB代码为255,255,255,其中255实际上是整个字节,这意味着128x128像素(16,384像素)的完全白色图像每个白色像素使用三个字节(R,G,B)(总= 49,2kb)?我显然猜不到,因为完全黑色的图像总大小为0b。什么是这个“决议”通常是72,这是什么意思?到目前为止,我已使用UIImageJPEGRepresentation(image, 1.0f);
将图像放入NSData中,并尝试了其他值,例如0.1f
。
加分问题:
在这里,我注意到一些奇怪的行为:
//Original image at 128*128px
UIImage *image1 = [player getImage];
//Convert image to NSData with compression quality at 0.1
NSData *imageData1 = UIImageJPEGRepresentation(image1, 0.1f);
//Print out the file size of the image:
NSLog(@"Image size after 0.1: %@", [NSByteCountFormatter stringFromByteCount:imageData1.length countStyle:NSByteCountFormatterCountStyleFile]);
//Convert back to UIImage from this NSData
UIImage *image2 = [UIImage imageWithData:imageData1];
//Convert again, back to NSData, now with compression quality at 1.0 (full?)
NSData *imageData2 = UIImageJPEGRepresentation(image2, 1.0f);
//Print out the file size of this as well:
NSLog(@"Image size after 0.1 THEN 1.0: %@", [NSByteCountFormatter stringFromByteCount:imageData2.length countStyle:NSByteCountFormatterCountStyleFile]);
//Result:
/*
Image size after 0.1: 5 KB
Image size after 0.1 THEN 1.0: 34 KB
*/
如果我将第一次转换更改为1.0而不是0.1,则还会打印出34 KB
。我不是从0.1转换为1.0?它以某种方式返回质量?或者这些只是指针,没有真正发生的事情?我已经尝试过显示图像了,我看不出两者之间有什么区别,所以要么它不会显示,要么就会有一些时髦的东西。
答案 0 :(得分:5)
仅仅因为一个字节不是255并不意味着它没有使用完整的字节。计算机无法理解部分字节(据我所知)。 32位位图中的黑色像素是4个字节。 32位位图中的白色像素是4个字节。 32位位图中的透明像素是4个字节。
此外,UIImage 永远不会对其进行任何压缩。它始终是未压缩的24位或32位位图。图形硬件无法理解JPEG或PNG等普通文件压缩方案。所以你在你的“怪异”代码中做的事情(这实际上是完全正常的行为)是这样的:接受UIImage并压缩它,然后解压缩它,然后再压缩它。在这个尺寸,你不太可能注意到JPEG质量的差异。
目前,实际上,图像的最高分辨率是每个通道1个字节,有4个通道(红色,蓝色,绿色,alpha)。这意味着128x128图像的最大可能尺寸为128x128x4字节或64 Kb。对于JPEG图像,我怀疑它会变得如此之高(图像压缩的目标是避免这种高文件大小,同时仍然保存尽可能多的质量)。差异的原因与“每英寸像素数”无关,这仅与显示硬件和打印机有关。这与某些模式比其他模式更容易压缩的事实有关。例如,实心红色方块将比猫的照片小得多。
72是图像的每英寸点数(DPI)值。这仅适用于打印或以英寸而不是像素显示图像。如果要打印某些内容,请以英寸为单位指定尺寸,而以像素为单位测量图片的尺寸。因此,每英寸最终会得到一定数量的像素。一英寸72像素是显示标准,而300是(或者至少是我最后一次检查)打印标准。