gpt4 book ai didi

ios - CGGraphics 内存和优化问题

转载 作者:行者123 更新时间:2023-11-29 10:49:09 25 4
gpt4 key购买 nike

目标

我正在开发一个实用程序,用于根据任意纵横比裁剪 UIImage,并将 aspectFitaspectFill 作为裁剪选项。 aspectFill 选项将以最终图像将被原始图像完全覆盖的方式裁剪原始图像。 aspectFit 将确保没有切割原始图像的像素,并且将在原始图像的两侧添加黑色条纹以使其适合纵横比。我知道已经有 3rd 方库可以做同样的工作,但我想自己做一个学习练习。

我的方法

  • 对于 aspectFill,我只是计算最终图像的偏移量和大小,并从原始 UIImage 中裁剪出 CGRect
  • 对于 aspectFit,我计算最终图像大小,然后制作一个 CGContextRef,使用 CGContextFillRect 进行填充。为此,我以所需的偏移量绘制原始图像(将原始图像保持在最终图像的中间)。

问题

为了测试此实用程序,我使用了一张 2MB 图像,它与 iPhone 相机照片的大小大致相同。出现了以下问题:

  • aspectFill 的实用程序按预期工作,每张图像花费大约 0.01 毫秒 的处理时间,这非常好。问题是,如果我尝试在循环中为大量图像 (10000+) 运行此实用程序,内存使用量会激增,直到应用程序崩溃。我添加了 @autoreleasepool block ,但它似乎没有任何区别。

  • aspectFit 实用程序有相反的问题。 @autoreleasepool block 按预期工作并定期释放对象,因此应用程序不会因循环中的任意数量的图像而崩溃。但是在这里,每张图片的处理时间在 130ms 左右,看起来很多。我尝试使用 UIGraphicsBeginImageContext 而不是 CGContextRef,但这会花费更多时间。

代码

aspectFill 的代码

//ox, oy are the image crop offsets calculated before and fw, fh are the width and height of final image

@autoreleasepool {
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(ox,oy,fw,fh));
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return finalImage;
}

aspectFit的代码

@autoreleasepool {
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGContextRef context = CGBitmapContextCreate(NULL, fw, fh, CGImageGetBitsPerComponent(image.CGImage), 0, colorSpace, CGImageGetBitmapInfo(image.CGImage));
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillRect(context, CGRectMake(0, 0, fw, fh));
CGRect rect = CGRectMake(ox, oy, image.size.width, image.size.height);
CGContextDrawImage(context, rect, image.CGImage);
CGImageRef newCGImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
UIImage *finalImage = [UIImage imageWithCGImage:newCGImage];
CGImageRelease(newCGImage);
return finalImage;
}

有人可以指出我做错了什么,或者给我一些优化来减少这个实用程序的处理时间吗?提前致谢!

最佳答案

解决方案

最后,在对 CGGraphicsUIGraphics 进行了一番折腾之后,我发现问题根本不在于实用程序。上面的代码是完美的,但罪魁祸首是我加载 UIImage 的方式。

我在用

[UIImage imageNamed:@"twomb.jpg"];

加载图像。 imageNamed 方法将图像缓存在内存中,总共 2MB。那是在浪费时间。将上述行更改为

[UIImage imageWithContentsOfFile:@"twomb.jpg"];

时间和内存使用都大幅减少。

关于ios - CGGraphics 内存和优化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21200750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com