我正在创建回合制游戏,并使用GameCenter进行处理。在这里的某一点上,我想在matchData中发送小图片/图标以进行匹配。虽然此查询与Game Center没有关系,但是由于Game Center matchData的最大值为64kb,因此我想知道如何确定图像尺寸为x * x时可以占用多少空间。我已经测试了几个图标/图像,它们在文件大小上有很大的不同。两张图片均为128x128像素,一张为13kb,另一张为34kb。我以为它们的“分辨率”或其他不同(每英寸像素数?)以及我猜某些颜色比其他颜色“大”,但我想知道如何确定我必须预期的颜色多大文件(总是假设是最坏的,对吧?)。
我已经制作了一个裁剪工具,因此图像始终为128x128,是否有办法知道128x128图像的大小(以字节为单位)? ,如果他们的“分辨率”为一百万,我该如何以编程方式降低该分辨率?(请注意,我完全不知道“分辨率”的含义是什么)

对于具有255,255,255的RGB代码的白色,其中255实际上是整个字节,这意味着128x128像素(16,384像素)的完全白色图像每个白色像素使用三个字节(R,G,B)(总计= 49) ,2kb)?我显然是在猜测NO,因为全黑图像的总大小为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吗?是否以某种方式返回了质量?还是这些仅仅是指针,什么都没有发生?我尝试显示图像,但看不到两者之间的任何区别,因此它要么无法显示,要么就有些时髦。

最佳答案

仅仅因为一个字节不是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(或至少是我上次检查的像素)。

07-28 06:25