Можно ли изменить размер UIImage без потери качества? - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть UIImage, который я вставил в UIImageView, к которому прикреплен распознаватель жестов пинч, который я использую для масштабирования изображения.Когда я масштабирую изображение в UIImageView, искажений нет, и он отлично масштабируется.Однако мне нужно изменить размер UIImage, не находясь в UIImageView, и когда я делаю это, используя следующий код, результат слегка искажается:

CGFloat width = self.imageView.frame.size.width;
CGFloat height = self.imageView.frame.size.height;

UIGraphicsBeginImageContext(CGSizeMake(width, height));
[self.image drawInRect:CGRectMake(0, 0, width, height)];
UIImage *resizedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];    
UIGraphicsEndImageContext();

Как вы можете видеть, я беру высоту иширина от imageView, потому что это то, к чему нужно масштабировать изображение.

Я знаю, что должна быть возможность идеально масштабировать его, если imageView способен сделать это, кто-нибудь случайно узнает, что я делаю неправильно?

ОБНОВЛЕНИЕ: Я прикрепилдо / после изображения (которое было изменено пользователем при просмотре изображения) и как оно выглядит после того, как я изменил его размер, используя описанный выше метод. BeforeAfter

Ответы [ 2 ]

1 голос
/ 03 марта 2012

У меня была такая же проблема, я использовал следующий код, чтобы исправить ее:

    CGFloat scale = 1.0;
if([[UIScreen mainScreen]respondsToSelector:@selector(scale)]) {        
    CGFloat tmp = [[UIScreen mainScreen]scale];
    if (tmp > 1.5) {
        scale = 2.0;    
    }
} 

if(scale > 1.5) {
    UIGraphicsBeginImageContextWithOptions(targetSize, NO, scale);
} else {
    UIGraphicsBeginImageContext(targetSize);
}
1 голос
/ 18 ноября 2011

Попробуйте это:

+ (UIImage*)rescaleImage:(UIImage *)image scaledToSize:(CGRect)newSize {
    UIGraphicsBeginImageContext(newSize.size);
    [image drawInRect:newSize];
    UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resImage;
}
...