2015-02-18 4 views
1

Я пытаюсь обрезать UIImage, чтобы сделать его круглым, я начинаю с 140 * 140px изображения и затем запустить этот код:Низкое качество UIImage после прикрепив ее к кругу

//round the image 

    UIImageView *roundView = [[UIImageView alloc] initWithImage:smallImage]; 
    UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, 1.0); 
    [[UIBezierPath bezierPathWithRoundedRect:roundView.bounds 
           cornerRadius:roundView.frame.size.width/2] addClip]; 
    [smallImage drawInRect:roundView.bounds]; 
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    smallImage = finalImage; 

    //end round image 

Это работает по желанию но качество очень низкое, изображение выглядит нечетким, а края вокруг круга зазубрены. Я хочу достичь их такого же эффекта, как:

image.layer.cornerRadius = self.thumbnailView.frame.size.width/2; 
image.clipsToBounds = YES; 

Не знаете, почему качество изображения настолько низкое. Может кто-нибудь дать мне несколько указателей, пожалуйста?

+1

Это compalsary для клипа вашего UIImage, чтобы сделать его круговым .. ?? вы можете изменить изображение в форме круглой формы, а затем добавить изображение в imageView .. – Chandan

+0

Я делал это раньше, но у меня много UIImages в виде таблицы, поэтому округление изображения значительно снижает производительность. – Kex

+1

@ Kex Мне кажется, что вы делаете это в методе 'cellForRowAtIndexPath'. Это неправильное место для этого. Создаются только несколько ячеек, а затем удаляются. Вам нужно сделать это один раз за созданную ячейку. Тогда у него уже будут закругленные углы для будущих повторных использования. – Fogmeister

ответ

4

Возможно, вы захотите сохранить масштаб на 0.f, чтобы он соответствовал шкале устройства (сетчатка/не сетчатка).

UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, 0.f); 

Вы можете сделать также нарисовать круг, как это:

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.f); 
CGRect interiorBox = CGRectInset(rect, 0.f, 0.f); 
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:insideBox]; 
[bezierPath addClip]; 
[image drawInRect:rect]; 
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

Это сработало, спасибо! – Kex

2

Вы передаете неправильный масштаб в UIGraphicsBeginImageContextWithOptions. Вы проезжаете 1. Используйте UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, [UIScreen mainScreen].scale);

0

Вы уверены, что вам действительно нужно сделать, это реальное изображение? Было бы недостаточно, чтобы просто округлить изображение?

Вы можете сделать это очень легко.

UIImageView *imageView = // your image view with the image 
imageView.frame = CGRectMake(0, 0, 140, 140); // the size you want 
imageView.clipsToBounds = YES; 
imageView.contentMode = UIViewContentModeScaleAspectFill; 
imageView.layer.cornerRadius = 70; // make the corner radius half of the size 

Это изображение отобразит ваше изображение, обрезанное в круг, по изображению.

Изображение остается неизменным. Это только изображение изображения, которое округлено.

Это намного дешевле (время и память).

Выполнение этого в таблице не замедлит его. Вам нужно сделать это только один раз для каждой из выделенных ячеек. Для повторно используемых ячеек вам не нужно делать это, как это делается при создании ячейки.

+0

Аскер писал, что «я хочу достичь ими такого же эффекта, как« image.layer.cornerRadius », поэтому, похоже, он знает об этом, и ему нужно изменить фактическое изображение. В любом случае, это может быть полезно для других людей, приезжающих сюда. – Vive

+0

@Vive Ах, LOL! Я пропустил это. Ну, из комментария OP кажется, что он неправильно использовал выделенные ячейки, поэтому он испытывал низкую производительность. Так что проблема в том, что. – Fogmeister

+0

Nope не был ячеек, имел массовые проблемы с таблицей на прошлой неделе, закончилось тем, что проблема заключалась в изменении радиуса угла на всех уровнях представления изображения. Похоже, что это сильно влияет на производительность прокрутки таблицы, если многие используются. – Kex

Смежные вопросы