Как объединить два изображения для отображения сетчатки (@ 2x)? - PullRequest
0 голосов
/ 16 февраля 2012

Я хочу добавить UIImage в UIImageView из UITableViewCell внутри UITableViewController.Это прекрасно работает:

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

Но теперь я хочу объединить два изображения и использовать код Я нашел здесь :

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

Это работает оченьхорошо со старым iPhone (320x480), но не на дисплее сетчатки.В моем проекте есть "@ 2x" -версии каждого изображения.Я анализирую код и получаю объяснение проблемы.

а) на iPhone 3 без объединения (РАБОТЫ)
- ширина изображения: 28,0
- высота изображения: 29,0
- масштаб изображения: 1,0

б) на iPhone 3 со слиянием (РАБОТЫ)
- ширина изображения: 28,0
- высота изображения: 29,0
- масштаб изображения: 1,0

с)на iPhone 4 без слияния (РАБОТАЕТ)
- ширина изображения: 28,0
- высота изображения: 29,0
- масштаб изображения: 2,0

d) на iPhone 4 со слиянием (НЕ РАБОТАЕТ)
- ширина изображения: 56,0
- высота изображения: 58,0
- масштаб изображения: 1,0

Как видите, объединение преобразует "28,0 / 29,0 / 2,0" в "56,0 /58,0 / 1,0 "изображение.И эти изображения становятся большими на дисплее сетчатки.

Как правильно объединить два изображения, чтобы получить изображение в масштабе 2,0?


Приложение: код, который я использую для объединения двух изображений (отсюда)

+ (UIImage*)mergeImage:(UIImage*)first withImage:(UIImage*)second
{
 // get size of the first image
 CGImageRef firstImageRef = first.CGImage;
 CGFloat firstWidth = CGImageGetWidth(firstImageRef);
 CGFloat firstHeight = CGImageGetHeight(firstImageRef);

 // get size of the second image
 CGImageRef secondImageRef = second.CGImage;
 CGFloat secondWidth = CGImageGetWidth(secondImageRef);
 CGFloat secondHeight = CGImageGetHeight(secondImageRef);

 // build merged size
 CGSize mergedSize = CGSizeMake(MAX(firstWidth, secondWidth), MAX(firstHeight, secondHeight));

 // capture image context ref
 UIGraphicsBeginImageContext(mergedSize);

 //Draw images onto the context
 [first drawInRect:CGRectMake(0, 0, firstWidth, firstHeight)];
 [second drawInRect:CGRectMake(0, 0, secondWidth, secondHeight)];

 // assign context to new UIImage
 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

 // end context
 UIGraphicsEndImageContext();

 return newImage;
}

1 Ответ

5 голосов
/ 16 февраля 2012

Вам необходимо вычислить объединенный размер на основе размеров 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;
...