如何合并两个图像用于视网膜显示(@ 2x)?

时间:2012-02-16 09:15:32

标签: iphone ios uiimage retina-display

我想在UIImage内的UIImageView的{​​{1}}中添加UITableViewCell。这很好用:

UITableViewController

但是现在,我想要合并两个图像并使用代码I've found here

cell.imageView.image = [UIImage imageNamed:@"myImage.png"];

这适用于旧的iPhone(320x480)但不适用于视网膜显示屏。在我的项目中,每个图像都有“@ 2x”版本。我分析了代码并对问题进行了解释。

a)在iPhone 3上没有合并(WORKS)
- 图像宽度:28.0
- 图像高度:29.0
- 图像比例:1.0

b)在iPhone 3上进行合并(WORKS)
- 图像宽度:28.0
- 图像高度:29.0
- 图像比例:1.0

c)在iPhone 4上没有合并(WORKS)
- 图像宽度:28.0
- 图像高度:29.0
- 图像比例:2.0

d)在iPhone 4上进行合并(WORKS NOT)
- 图像宽度:56.0
- 图像高度:58.0
- 图像比例:1.0

如您所见,合并将“28.0 / 29.0 / 2.0”转换为“56.0 / 58.0 / 1.0”图像。这个图像在视网膜显示屏上显示得很大。

如何正确合并两张图片以获得2.0的影像?


附录:我用于合并两个图像(from here)

的代码
UIImage *mergedImage = [MyUtils mergeImage:@"myBackImage.png" withImage:@"myFrontImage.png"];

1 个答案:

答案 0 :(得分:5)

您需要根据UIImage尺寸计算合并尺寸,而不是CGImage尺寸,并且您需要使用图像尺寸的最大尺寸来创建图形上下文。试试这个:

CGSize firstSize = first.size;
CGSize secondSize = second.size;
CGSize mergedSize = CGSizeMake(MAX(firstSize.width, secondSize.width),
    MAX(firstSize.height, secondSize.height));
CGFloat mergedScale = MAX(first.scale, second.scale);

UIGraphicsBeginImageContextWithOptions(mergedSize, NO, mergedScale);

[first drawAtPoint:CGPointZero];
[second drawAtPoint:CGPointZero];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;