このUIImageのサイズ変更コードが機能しないのはなぜですか?

私は画像のサイズを変更するために次のコードを使用しています。これは、uiimageviewの内部に収まるようになりますが、縦横比は維持されます。問題は、カメラで撮影したポートレート画像などの一部の画像では、何らかの未知の理由で画像を縦方向に伸ばしてしまうことです。どんな解決策ですか?

私はMGImageResizeScaleを使用しています。

- (UIImage *)imageToFitSize:(CGSize)fitSize method:(MGImageResizingMethod)resizeMethod
{
    float imageScaleFactor = 1.0;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
    if ([self respondsToSelector:@selector(scale)]) {
        imageScaleFactor = [self scale];
    }
#endif

    float sourceWidth = [self size].width * imageScaleFactor;
    float sourceHeight = [self size].height * imageScaleFactor;
    float targetWidth = fitSize.width;
    float targetHeight = fitSize.height;
    BOOL cropping = !(resizeMethod == MGImageResizeScale);

   //Calculate aspect ratios
    float sourceRatio = sourceWidth/sourceHeight;
    float targetRatio = targetWidth/targetHeight;

   //Determine what side of the source image to use for proportional scaling
    BOOL scaleWidth = (sourceRatio <= targetRatio);
   //Deal with the case of just scaling proportionally to fit, without cropping
    scaleWidth = (cropping) ? scaleWidth : !scaleWidth;

   //Proportionally scale source image
    float scalingFactor, scaledWidth, scaledHeight;
    if (scaleWidth) {
        scalingFactor = 1.0/sourceRatio;
        scaledWidth = targetWidth;
        scaledHeight = round(targetWidth * scalingFactor);
    } else {
        scalingFactor = sourceRatio;
        scaledWidth = round(targetHeight * scalingFactor);
        scaledHeight = targetHeight;
    }
    float scaleFactor = scaledHeight/sourceHeight;

   //Calculate compositing rectangles
    CGRect sourceRect, destRect;
    if (cropping) {
        destRect = CGRectMake(0, 0, targetWidth, targetHeight);
        float destX, destY;
        if (resizeMethod == MGImageResizeCrop) {
           //Crop center
            destX = round((scaledWidth - targetWidth)/2.0);
            destY = round((scaledHeight - targetHeight)/2.0);
        } else if (resizeMethod == MGImageResizeCropStart) {
           //Crop top or left (prefer top)
            if (scaleWidth) {
               //Crop top
                destX = 0.0;
                destY = 0.0;
            } else {
               //Crop left
                destX = 0.0;
                destY = round((scaledHeight - targetHeight)/2.0);
            }
        } else if (resizeMethod == MGImageResizeCropEnd) {
           //Crop bottom or right
            if (scaleWidth) {
               //Crop bottom
                destX = round((scaledWidth - targetWidth)/2.0);
                destY = round(scaledHeight - targetHeight);
            } else {
               //Crop right
                destX = round(scaledWidth - targetWidth);
                destY = round((scaledHeight - targetHeight)/2.0);
            }
        }
        sourceRect = CGRectMake(destX/scaleFactor, destY/scaleFactor, 
                                targetWidth/scaleFactor, targetHeight/scaleFactor);
    } else {
        sourceRect = CGRectMake(0, 0, sourceWidth, sourceHeight);
        destRect = CGRectMake(0, 0, scaledWidth, scaledHeight);
    }

   //Create appropriately modified image.
    UIImage *image = nil;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
        UIGraphicsBeginImageContextWithOptions(destRect.size, NO, 0.0);//0.0 for scale means "correct scale for device's main screen".
        CGImageRef sourceImg = CGImageCreateWithImageInRect([self CGImage], sourceRect);//cropping happens here.
        image = [UIImage imageWithCGImage:sourceImg scale:0.0 orientation:self.imageOrientation];//create cropped UIImage.
        [image drawInRect:destRect];//the actual scaling happens here, and orientation is taken care of automatically.
        CGImageRelease(sourceImg);
        image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
#endif
    if (!image) {
       //Try older method.
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef context = CGBitmapContextCreate(NULL, fitSize.width, fitSize.height, 8, (fitSize.width * 4), 
                                                     colorSpace, kCGImageAlphaPremultipliedLast);
        CGImageRef sourceImg = CGImageCreateWithImageInRect([self CGImage], sourceRect);
        CGContextDrawImage(context, destRect, sourceImg);
        CGImageRelease(sourceImg);
        CGImageRef finalImage = CGBitmapContextCreateImage(context);    
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);
        image = [UIImage imageWithCGImage:finalImage];
        CGImageRelease(finalImage);
    }

    return image;
}
1
これがあなたのコードではない場合(そしてそうでない場合)は、最初に著者に連絡するか、バグを報告する必要があります。 github.com/mattgemmell/MGImageUtilities/issues
追加された 著者 vikingosegundo,
この記事を読むことをお勧めします: vocaro.com/trevor/blog/2009/10/12/… また、そこにリンクされているコードははるかにエレガントであるようです
追加された 著者 vikingosegundo,

2 答え

特にuiimageviewを使用している場合は、この方法を提案しません

画像ビューに画像を設定して、画像ビューのフレームをリセットすると、画像はその画像と共に拡大縮小されます

imageView.image = someImage;
imageView.frame = CGRectMake(imageView.frame.origin.x, imageView.frame.origin.y, 30,30);
1
追加された
スケーリングが十分でない理由はたくさんあります。いくつかの記事をご覧ください: vocaro.com/trevor/blog/2009/10/12 /&hellip;
追加された 著者 vikingosegundo,
良い点、ごめんなさい
追加された 著者 DanZimm,

コード内にいくつかのブレークポイントとNSLogを作成すると、イメージのサイズが表示されます。そして、あなたはカメラを介して、それが画像のサイズを変更する場合は覚えています。宜しくお願いします。

0
追加された