Изменить размер изображения с сохранением соотношения сторон

Я разрабатываю приложение, в котором пользователи щелкают изображения и загружают их. В моем приложении есть кнопка, и при нажатии на нее открывается режим камеры. Пользователь может щелкнуть изображение и просмотреть предварительный просмотр. В превью изображение выглядит хорошо и занимает весь экран. Позже мне нужно отобразить это изображение в UIImageView шириной 110 и высотой 111. Когда я показываю его в этом, изображение искажается и обрезается по краям. Моя основная задача - сохранить соотношение сторон.

Я пробовал это делать.

- (void)displayCapturedImage
{
//[self.imageView setImage:self.capturedImage];
    CGSize smallSize = CGSizeMake(110, 111);
    [self.imageView setImage:[self imageWithImage:self.capturedImage scaledToSize:smallSize]];

}

- (UIImage*)imageWithImage:(UIImage*)image
          scaledToSize:(CGSize)newSize;
{
    UIGraphicsBeginImageContext( newSize );
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

но это не сработало для меня. Изображение все еще искажено.


person user1982519    schedule 28.06.2013    source источник


Ответы (1)


Вам необходимо самостоятельно рассчитать коэффициент масштабирования. Определите, насколько меньше должно быть изображение, и примените это как к ширине, так и к высоте.

Что-то вроде

float widthFactor  = targetWidth / width;
            float heightFactor = targetHeight / height;

            if ( widthFactor < heightFactor )
                scaleFactor = widthFactor;
            else
                scaleFactor = heightFactor;

            scaledWidth  = width  * scaleFactor;
            scaledHeight = height * scaleFactor;

            if ( widthFactor < heightFactor )
                thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;

            else if ( widthFactor > heightFactor )
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
person Kyle Richter    schedule 28.06.2013