我正在尝试将图像大小减少到64000字节,这是我的代码和日志。
NSData *beforeData = UIImageJPEGRepresentation(self.photo, 1.0);
NSLog(@"Size of Image(MB):%u",[beforeData length]/1048576);
float compression = 0.6;
NSData* imgData = UIImageJPEGRepresentation(self.photo, compression);
while ([imgData length] > 400) {
compression -= 0.1;
imgData = UIImageJPEGRepresentation(self.photo, compression);
}
UIImage *result = [[UIImage alloc] initWithData:imgData];
NSData *data = UIImageJPEGRepresentation(result, 1.0);
NSLog(@"Size of Image(MB):%u",[data length]/1048576);
LOG :
我不知道为什么尺寸保持不变..也许我需要使用
[data writeToFile:filePath atomically:YES];
答案 0 :(得分:1)
由于您只是在循环中更改JPEG压缩,因此文件大小会减少。
但是,当您从JPG数据创建UIImage
时,UIImage
的大小并不取决于JPG数据的大小。
UIImage
的大小基于高度x宽度x 4(以字节为单位)。
答案 1 :(得分:1)
嗯,有一件事是压缩图像的大小,另一件事是打开到内存然后再次保存的图像的大小。
我会试着举个例子:说你要去度假,你需要把很多东西放在一个袋子里,它们不适合它,你必须压缩它们。
要做到这一点,你坐在袋子的顶部,然后关闭它。
之后再次打开它并尝试关闭而不再压缩。
这就是你在做什么
如果要减小图像的大小,则应减小像素区域,如果要保留像素尺寸,可以将压缩值保存在局部变量中。
打开的图片会占用以下内容:H
x W
x number of channel
x number of bit for channel
。这意味着具有4通道RGBA 8位(每个1字节)的图像将占用:H x W x 4
字节
答案 2 :(得分:0)
您以1.0的压缩率记录图像的大小。为什么不在最后一行记录[imgData length]
而不是[data length]
?
NSData *beforeData = UIImageJPEGRepresentation(self.photo, 1.0);
NSLog(@"Size of Image(MB):%u",[beforeData length]/1048576);
float compression = 0.6;
NSData* imgData = UIImageJPEGRepresentation(self.photo, compression);
while ([imgData length] > 400) {
compression -= 0.1;
imgData = UIImageJPEGRepresentation(self.photo, compression);
}
UIImage *result = [[UIImage alloc] initWithData:imgData];
NSLog(@"Size of Image after (MB):%u",[imgData length]/1048576);
答案 3 :(得分:0)
不要从压缩数据创建新图像。如果压缩确实减少了数据长度,那么最终会产生无限循环。只需将三行更改为:
NSLog(@"Size of Image(MB):%u",[imgData length]/1048576);
答案 4 :(得分:0)
当我尝试打印时
NSLog(@"Size of Image(MB):%u",[imgData length]/1048576);
它看起来没问题,但是当我从刚刚创建的NSData再次创建图像时,大小将恢复为2MB。