Пытаюсь обрезать мой UIImage с соотношением сторон 1:1 (квадрат), но он продолжает увеличивать изображение, делая его размытым. Зачем?
Учитывая UIImage, я пытаюсь превратить его в квадрат. Просто отрежьте один из самых больших размеров, чтобы получить соотношение сторон 1: 1.
UIImage *pic = [UIImage imageNamed:@"pic"];
CGFloat originalWidth = pic.size.width;
CGFloat originalHeight = pic.size.height;
float smallestDimension = fminf(originalWidth, originalHeight);
CGRect square = CGRectMake(0, 0, smallestDimension, smallestDimension);
CGImageRef imageRef = CGImageCreateWithImageInRect([pic CGImage], square);
UIImage *squareImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
UIImageView *imageView = [[UIImageView alloc] initWithImage:squareImage];
imageView.frame = CGRectMake(100, 100, imageView.bounds.size.width, imageView.bounds.size.height);
[self.view addSubview:imageView];
Но вот к чему это приводит:
Когда это должно выглядеть так, но только чуть уже.
Почему это? Изображения pic
(150x114) / pic@2x
(300x228).
1 ответ
Проблема в том, что вы смешиваете логические и пиксельные размеры. На устройствах без Retina эти два одинаковы, но на устройствах Retina (как в вашем случае) размер пикселя фактически вдвое превышает логический размер.
Обычно при проектировании вашего GUI вы всегда можете просто думать в логических размерах и координатах, и iOS (или OS X) позаботится о том, чтобы все удваивалось на экранах сетчатки. Однако в некоторых случаях, особенно при создании изображений самостоятельно, вы должны явно указать, какой размер вы имеете в виду.
UIImage
"s size
Метод возвращает логический размер. Это разрешение на экранах без сетчатки. Вот почему CGImageCreateWithImageInRect
создаст только новое изображение из верхней левой половины изображения.
Умножьте ваш логический размер на масштаб изображения (1 на устройствах без сетчатки, 2 на устройствах с сетчаткой):
CGFloat originalWidth = pic.size.width * pic.scale;
CGFloat originalHeight = pic.size.height * pic.scale;
Это гарантирует, что новое изображение будет создано из полной высоты (или ширины) исходного изображения. Теперь остающаяся проблема заключается в том, что при создании нового UIImage
с помощью
UIImage *squareImage = [UIImage imageWithCGImage:imageRef];
iOS подумает, что это обычное изображение без сетчатки, и оно будет отображаться в два раза больше, чем вы ожидаете. Чтобы это исправить, вы должны указать масштаб при создании UIImage
:
UIImage *squareImage = [UIImage imageWithCGImage:imageRef
scale:pic.scale
orientation:pic.imageOrientation];