1

サイズ3264 × 2448の画像が 1 つと、サイズ768 × 1024の画像ビューがあります。画質を落とさずにビューのサイズに等しい画像サイズを取得したい。

私はそれをグーグルで検索しました。AspectFit適切な出力が得られません。次のコードを試しました:

- (UIImage *)imageByScalingProportionallyToSize: (CGSize)targetSize {

   UIImage *sourceImage = self;
   UIImage *newImage = nil;

   CGSize imageSize = sourceImage.size;
   CGFloat width = imageSize.width;
   CGFloat height = imageSize.height;

   CGFloat targetWidth = targetSize.width;
   CGFloat targetHeight = targetSize.height;

   CGFloat scaleFactor = 0.0;
   CGFloat scaledWidth = targetWidth;
   CGFloat scaledHeight = targetHeight;

   CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

   if (CGSizeEqualToSize(imageSize, targetSize) == NO) {

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

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

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

        // center the image

        if (widthFactor < heightFactor) {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
        } else if (widthFactor > heightFactor) {
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
       }
    }


    // this is actually the interesting part:

    UIGraphicsBeginImageContext(targetSize);

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(newImage == nil) NSLog(@"could not scale image");


    return newImage ;
}
4

3 に答える 3

1

以下のコードを試してください:

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

   return newImage;
}

新しいサイズを (768,1024) として指定し、元の画像を渡しますが、元の画像の高さと幅の比率が変換された画像の比率と同じであることを確認してください。

于 2013-06-26T12:58:12.450 に答える
0

画像のサイズ変更を含むいくつかのプロジェクトの参考として、この記事を使用しました。UIImage+Resize カテゴリは、サイズ変更されたバージョンの画像が作成されるまで、パフォーマンスが大幅に低下することを除いて、かなりうまく機能します。

サイズ変更されたバージョンをディスクにキャッシュして、将来のサイズ変更を避けることができます。また、まだ試していませんが、バックグラウンド スレッドで画像のサイズを変更して、UI のブロックを回避できます。

于 2013-06-26T12:17:36.557 に答える
0

入力画像の寸法はあなたUIImageViewの寸法の倍数ではありません.aspectFitがここで機能しないのはそのためです(おそらく側面にギャップが残ります). scaleToFill を使用すると、画像の寸法がオフになるため、画像がゆがみます。画像を適切に保存するには、これらのいずれかの寸法について何かをする必要があると思います.

于 2013-06-26T12:17:46.687 に答える