2011-11-25 102 views
-1

我使用下面的代碼來調整圖像的大小,使其適合我有一個uiimageview,但保持高寬比。問題在於,在某些圖像上,例如使用相機拍攝的肖像圖像,它會以某種未知的原因垂直拉伸圖像。任何解決方案爲什麼這個UIImage調整代碼不起作用?

我正在使用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; 
} 
+0

如果ISN你的代碼(不是),你應該先聯繫作者,即通過提交一個bug:https://github.com/mattgemmell/MGImageUtilities/issues – vikingosegundo

+0

我想建議你閱讀這篇文章:http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/也鏈接的代碼似乎更加優雅 – vikingosegundo

回答

1

我不建議這種方法,特別是如果你正在使用一個UIImageView

設置在ImageView的圖像,然後重置的ImageView的框架和圖像將按比例與它

imageView.image = someImage; 
imageView.frame = CGRectMake(imageView.frame.origin.x, imageView.frame.origin.y, 30,30); 
+1

有很多去原因,爲什麼縮放比例不夠。看到一些在這裏:http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/ – vikingosegundo

+0

好點,對不起 – DanZimm

0

怎麼樣可以做些斷點和NSLog的在你的代碼,它會告訴你圖像大小。我記得如果你通過相機,它會改變圖像的大小。最好的祝福。

相關問題