Цветовете са малко по-различни при създаване на ново изображение от UIImage с UIGraphics и CGImage

Използвам UIImageView с contentMode:UIViewContentModeScaleAspectFill, който съдържа изображение, което не запълва изцяло UIImageView.

Например UIImageView има размер: width=480;height=180, но изображението вътре има само размер: width=320;height=180. Следователно има ясно поле от лявата и дясната страна на 80.

Създадох тази функция, за да запълня тези 80px с модел на първия правоъгълник 1x180px:

- (UIImage *)repeatEdgesForImage:(UIImage *)image withDesiredSize:(CGSize)size {

UIImage *result = nil;

double ratio = image.size.height / size.height;
int width = size.width * ratio;

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, image.size.height), NO, 0.0);

CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0, 0, 1, image.size.height));
UIImage *fillImg = [UIImage imageWithCGImage:imageRef];
[fillImg drawAsPatternInRect:CGRectMake(0, 0, width, image.size.height)];

int offset = (width - image.size.width) / 2;
[image drawAtPoint:CGPointMake(offset, 0) blendMode:kCGBlendModeNormal alpha:1.0];

result = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return result; }

Работи добре, но резултатът не е съвсем перфектен, защото цветовете са малко по-различни:

въведете описание на изображението тук

Както можете да видите, лявата и дясната страна са малко по-различни по цвят. Не съм сигурен дали това идва от преобразуването на UIImage в CGImage или от някъде другаде?


person electronix384128    schedule 28.04.2013    source източник


Отговори (1)


Сам намерих отговора.

Проблемът беше в изходното изображение. Изглежда, че първият 1px е малко по-различен от останалите...

промяната на този ред работи:

CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(5, 0, 1, image.size.height));

По принцип напускане на зона за сигурност от 5px ;) и след това вземане на 1px ...

person electronix384128    schedule 29.04.2013