- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个实用程序,用于根据任意纵横比裁剪 UIImage
,并将 aspectFit
或 aspectFill
作为裁剪选项。 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;
}
有人可以指出我做错了什么,或者给我一些优化来减少这个实用程序的处理时间吗?提前致谢!
最佳答案
最后,在对 CGGraphics
和 UIGraphics
进行了一番折腾之后,我发现问题根本不在于实用程序。上面的代码是完美的,但罪魁祸首是我加载 UIImage
的方式。
我在用
[UIImage imageNamed:@"twomb.jpg"];
加载图像。 imageNamed
方法将图像缓存在内存中,总共 2MB。那是在浪费时间。将上述行更改为
[UIImage imageWithContentsOfFile:@"twomb.jpg"];
时间和内存使用都大幅减少。
关于ios - CGGraphics 内存和优化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21200750/
目标 我正在开发一个实用程序,用于根据任意纵横比裁剪 UIImage,并将 aspectFit 或 aspectFill 作为裁剪选项。 aspectFill 选项将以最终图像将被原始图像完全覆盖的方
我正在 iOS 中创建一个旋转旋钮按钮。图形设计师给了我 png 图层,所以我使用图像上下文来混合图层。 在旋转时,只有部分图层会旋转。我的目标是为这些旋转设置动画。 目前,我正在使用 - (BOOL
我是一名优秀的程序员,十分优秀!