web-dev-qa-db-ja.com

アスペクト比を維持しながらUIImageのサイズを変更する方法

アスペクト比を維持したままUIImageのサイズを変更したいと思います。次のコードを記述しましたが、期待どおりに動作しません。

コード

-(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;
}

ここで正確に何が問題になっていますか?

14
Rahul

私はいくつかのプロジェクトでこれに似たものを使用しています:

- (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;
}
41
zpasternack

これがUIに表示するためのものである場合は、Interface Builderを使用して、「AspectFit」プロパティを指定できます。

コンテンツモードをUIViewContentModeScaleAspectFitに設定することで、コードでこれを行うこともできます。

imageView.contentMode = UIViewContentModeScaleAspectFit;
23
Dan J

この方法では、画像と最大寸法を取得します。元の画像の最大サイズが指定された最大サイズよりも小さい場合は、元の画像が元に戻されるため、画像が爆破されることはありません。それ以外の場合は、指定されたものと元のアスペクト比によって決定されたものの最大寸法を持つ新しい画像を取得します。したがって、例として、1024x768の画像と最大サイズ640を指定すると、640x480バージョンが返され、768x1024の画像と最大サイズ640を指定すると、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;
}
10
user170934

私の場合(UIViewに画像を表示したかった)、自動レイアウトで比率を維持する ここ は素晴らしかった。私にとって記事の最も重要な部分は(ほとんど引用)でした:

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

[self.imageView addConstraint:constraint];

唯一のことは、画像の実際の幅と高さに応じて比率を計算することです。私はこの方法が簡単でエレガントだと感じました。

5
Julian Król
- (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;
}
0
channi