对于你们所有的图形专家来说,我想知道这两种方法中哪一种更适合调整UIImage的大小:
我遇到的第一个是简单而受欢迎的,如下:
-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight
{
UIGraphicsBeginImageContext(CGSizeMake(resizedWidth ,resizedHeight));
[image drawInRect:CGRectMake(0, 0, resizedWidth, resizedHeight)];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result;
}
我在这个链接http://iphonesdksnippets.com/post/2009/05/06/Resize-image-and-keep-aspect-ratio.aspx找到的第二种方法似乎与上面相同,但更复杂(我真的不明白其中发生了什么):
-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight
{
CGImageRef imageRef = [image CGImage];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmap = CGBitmapContextCreate(NULL, resizedWidth, resizedHeight, 8, 4 * resizedWidth, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(bitmap, CGRectMake(0, 0, resizedWidth, resizedHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage *result = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return result;
}
所以我的问题是,哪种方式更好,为什么?
答案 0 :(得分:4)
第二个是线程安全的。
答案 1 :(得分:1)
这是一个相当晚的回复,但我会继续添加它。
除了prestanda之外,我实际上发现了两种方法之间的一些行为差异。
在我的照片应用中,我有自定义相机视图,可将任何拍摄的图像发送到自定义图像编辑器。在应用程序中,自定义相机/编辑器视图是横向独占的。但是,原生相机窗口本身并非如此。
因此,只要在肖像模式下拍摄照片,最终结果就会失真。每当宽度<1时,通过翻转宽度和高度就可以容易地处理这些变形。高度。
上述两种方法(简单方法)的第一种方法导致图像旋转90度并仍然失真。然而,第二个完美地调整了图像的大小!
我猜这与基于图形上下文的行为有关。第二种方法不使用这种上下文,它在我的情况下完美无缺。
答案 2 :(得分:0)
这是一种高级别和低级别的方法。
哪个更好?取决于你的目标。
高级方法更具可读性(对我而言),也许低级方法的速度快一纳秒(没有测试)。
判断算法很难......
答案 3 :(得分:0)
您可能希望调整图像大小的方式有很多种。即使您有新宽度和新高度的情况,您可能要么想要将图像调整为新尺寸并忽略比例,要么按比例缩放图像并裁剪为新尺寸。
有一个项目有一个干净的API:https://github.com/mustangostang/UIImage-Resize。它使用第一种方法: - )