0

我有一个 640x480 像素的图像,我需要将其裁剪并居中到 596x596 像素的 UIImage 中。任何空白区域都应为黑色(图像上方和下方应为黑色)。现在我正在像这样裁剪它......

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

但是空白的空间是透明的。我该怎么做呢?

谢谢

4

2 回答 2

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];
于 2012-05-02T02:48:05.870 回答
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;

}

`

于 2012-10-09T10:07:49.540 回答