2011-07-15 6 views
14

Chcę zmienić rozmiar obiektu UIImage przy zachowaniu jego współczynnika kształtu. Napisałem poniższy kod, ale nie działa zgodnie z oczekiwaniami.Jak zmienić rozmiar obiektu UII przy zachowaniu jego współczynnika proporcji

Kod

-(UIImage *) scaleImage: (UIImage *) image toSize: (CGSize) targetSize { 

    CGFloat scaleFactor = 1.0; 
    if (image.size.width > targetSize.width || image.size.height > targetSize.height) 
     if (!((scaleFactor = (targetSize.width/image.size.width)) > (targetSize.height/image.size.height))) //scale to fit width, or 
      scaleFactor = targetSize.height/image.size.height; // scale to fit heigth. 
    UIGraphicsBeginImageContext(targetSize); 
    CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor)/2, (targetSize.height - image.size.height * scaleFactor)/2, 
     image.size.width * scaleFactor, image.size.height * scaleFactor); 
    [image drawInRect: rect]; 
    UIImage * scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return scaledImage; 
} 

Czym dokładnie jest nie tak tutaj?

Odpowiedz

42

Używam coś podobnego do tego w kilku projektach:

- (UIImage*) scaleImage:(UIImage*)image toSize:(CGSize)newSize { 
    CGSize scaledSize = newSize; 
    float scaleFactor = 1.0; 
    if(image.size.width > image.size.height) { 
     scaleFactor = image.size.width/image.size.height; 
     scaledSize.width = newSize.width; 
     scaledSize.height = newSize.height/scaleFactor; 
    } 
    else { 
     scaleFactor = image.size.height/image.size.width; 
     scaledSize.height = newSize.height; 
     scaledSize.width = newSize.width/scaleFactor; 
    } 

    UIGraphicsBeginImageContextWithOptions(scaledSize, NO, 0.0); 
    CGRect scaledImageRect = CGRectMake(0.0, 0.0, scaledSize.width, scaledSize.height); 
    [image drawInRect:scaledImageRect]; 
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();  

    return scaledImage; 
} 
+1

To wygląda podobnie jak w moich projektach,^1. – chown

+2

To przekrzywiło moje obrazy, ale UIImage + FX z github https://github.com/nicklockwood/FXImageView ma aspekt wypełnienia – PetrV

+0

dziękuję :) nie ma deformacji naprawdę dobrze –

23

Jeśli jest do wyświetlania w interfejsie użytkownika, można użyć interfejsu Builder i określić „Aspekt Fit” mienia.

Można również zrobić to w kodzie poprzez ustawienie trybu treści do UIViewContentModeScaleAspectFit:

imageView.contentMode = UIViewContentModeScaleAspectFit; 
10

Ta metoda bierze obraz i maksymalny wymiar. Jeśli maksymalny rozmiar oryginalnego obrazu jest mniejszy niż określony maksymalny wymiar, otrzymasz oryginał z powrotem, aby nie został wysadzony w powietrze. W przeciwnym razie otrzymasz nowy obraz mający maksymalny rozmiar jednego określonego, a drugi określony przez oryginalny współczynnik proporcji. Na przykład, jeśli nadasz mu obraz 1024x768 i maksymalny wymiar 640, otrzymasz wersję 640x480, jeśli nadasz mu obraz 768x1024 i maksymalny wymiar 640, otrzymasz wersję 480x640.

- (UIImage *)resizeImage:(UIImage *)image 
     withMaxDimension:(CGFloat)maxDimension 
{ 
    if (fmax(image.size.width, image.size.height) <= maxDimension) { 
     return image; 
    } 

    CGFloat aspect = image.size.width/image.size.height; 
    CGSize newSize; 

    if (image.size.width > image.size.height) { 
     newSize = CGSizeMake(maxDimension, maxDimension/aspect); 
    } else { 
     newSize = CGSizeMake(maxDimension * aspect, maxDimension); 
    } 

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 1.0); 
    CGRect newImageRect = CGRectMake(0.0, 0.0, newSize.width, newSize.height); 
    [image drawInRect:newImageRect]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 
+0

Wielkie dzięki ... po prostu to, czego potrzebowałem – DaSilva

0
- (UIImage *)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize { 
    UIGraphicsBeginImageContext(newSize); 
    float ratio = newSize.width/image.size.width; 
    [image drawInRect:CGRectMake(0, 0, newSize.width, ratio * image.size.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    NSLog(@"New Image Size : (%f, %f)", newImage.size.width, newImage.size.height); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
5

W moim przypadku (chciałem mieć zdjęcie na UIView) i zachować proporcje z układem automatycznego sposób opisany here był wielki. Najważniejszą część artykułu była dla mnie (prawie cytowanie):

constraint = [NSLayoutConstraint constraintWithItem:self.imageView 
              attribute:NSLayoutAttributeHeight 
              relatedBy:NSLayoutRelationEqual 
              toItem:self.imageView 
              attribute:NSLayoutAttributeWidth 
             multiplier:ration 
              constant:0.0f]; 

[self.imageView addConstraint:constraint]; 

jedyną rzeczą jest, aby obliczyć stosunek według rzeczywistej szerokości i wysokości obrazu. Znalazłem w ten sposób łatwe i eleganckie.