2012-05-02 62 views
0

我有一个640x480像素的图像,我需要裁剪并将它置于596x596 px UIImage中。任何空白空间都应该是黑色的(它应该在图像上方和下方黑色)。现在,我种植像这样......如何在iOS的CGContext中显示黑色的空白空间

-(UIImage*)cropImage:(UIImage *)theImage toFitSize:(CGSize)theSize 
{ 
CGFloat CROP_X = floorf((theImage.size.width-theSize.width)/2); 
CGFloat CROP_Y = floorf((theImage.size.height-theSize.height)/2); 

CGRect imageRect = CGRectMake(CROP_X, CROP_Y, theSize.width, theSize.height); 

UIGraphicsBeginImageContext(imageRect.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetRGBFillColor(context, 0, 0, 0, 1); 
CGRect drawRect = CGRectMake(-imageRect.origin.x, -imageRect.origin.y, theImage.size.width, theImage.size.height); 
CGContextClipToRect(context, CGRectMake(0, 0, imageRect.size.width, imageRect.size.height)); 
[theImage drawInRect:drawRect]; 
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return finalImage; 
} 

而且我也试过

- (UIImage *)croppedImage:(CGRect)bounds 
{ 
CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds); 
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
return croppedImage; 
} 

但空空间出来为透明。我该怎么做呢?

谢谢

回答

0

你真的需要改变图像吗?如果您只是要展示剪辑后的图像,则可以配置UIImageView backgroundColor属性以获得所需的效果。

CGRect largerRect = CGRectMake(/* larger rect */); 
CGRect smallerRect = CGRectMake(/* smaller rect */); 

UIImage *croppedImage = [self cropImage:largerImage toFitSize:smallerRect]; 

// make the view the original size 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:largerRect]; 
imageView.image = croppedImage; 

// center the cropped image and give it a loud background color 
imageView.contentMode = UIViewContentModeCenter; 
imageView.backgroundColor = [UIColor redColor]; 
+0

真棒!我将contentMode更改为UIViewContentModeScaleAspectFit,因为我将图像保存为视网膜大小,但以正常大小显示。谢谢! –

0

这是调整图像加工代码,你只用resizeimage功能和图像调整大小,只要你想宽度高度

-`-(UIImage *)resizeImage:(UIImage *)image{ 
float width = image.size.width; 
float height = image.size.height; 

float maxSide = 310; 

if (width >= height && width > maxSide) 
{ 
    width = maxSide; 
    height = (height*(width/image.size.width)); 

} 
else{ 
    if (height > maxSide) 
    { 
     height = maxSide; 
     width = (width * (height/image.size.height)); 
    } 
} 

if ((int)width % 2 != 0) 
{ 
    width-- ; 
} 
if ((int)height %2 !=0) 
{ 
    height-- ; 
} 

UIImage *newImage; 

if (width != image.size.width) 
    newImage = [self scaleImage:image ToSize:CGSizeMake(width,height)]; 
else 
    newImage = image; 
return newImage;}- (UIImage*)scaleImage:(UIImage*)image ToSize:(CGSize)targetSize{ 
if (image == nil) 
    return nil; 

UIImage *sourceImage = image; 
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; // scale to fit height 
    else 
     scaleFactor = heightFactor; // scale to fit width 
    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; 
     } 
}  

UIGraphicsBeginImageContext(targetSize); // this will crop 

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

[sourceImage drawInRect:thumbnailRect]; 

newImage = UIGraphicsGetImageFromCurrentImageContext(); 
if(newImage == nil) 
{ 

} 


UIGraphicsEndImageContext(); 
return newImage; 

}

`