UIImage调整大小并裁剪以适应框架

3
我知道这个问题已经被问过很多次,但他们的答案会让我的图片失去质量。它们都变得像素化了。所以即使它正确地裁剪和调整大小,它也会失去质量。
为了方便您检查,这是每篇帖子中都包含的算法:
- (UIImage*)scaleAndCropImage:(UIImage *)aImage forSize:(CGSize)targetSize
{
UIImage *sourceImage = aImage;
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)
{
    NSLog(@"could not scale image");
}

//pop the context to get back to the default
UIGraphicsEndImageContext();

return newImage;
 }

你应该使用UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0),这样正确的比例因子才能应用于位图,不确定这是否会导致你的问题,但在Retina显示屏上可能会出现问题。 - peko
太棒了,你能把它变成一个答案吗? - subharb
如果这引起了您的问题,当然。 - peko
2个回答

5

在您开始使用UIGraphicsImageContext之前,请使用UIGraphicsBeginImageContextWithOptions。尝试像这样:

UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0)

请注意上面传递的三个参数,我将按顺序介绍它们:
  1. targetSize 是以点(而不是像素)测量的图像大小。
  2. NO 是一个BOOL值(可以是YES或NO),表示图像是否100%不透明。将其设置为NO将保留透明度并创建alpha通道以处理透明度。
  3. 上述代码中最重要的部分是最后一个参数0.0。这是将应用的图像比例因子。将值指定为0.0会设置当前设备屏幕的比例因子。这意味着质量将得到保留,并且在Retina显示器上看起来特别好。
这是有关UIGraphicsBeginImageContextWithOptionsApple文档

0

你应该使用 UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0) 而不是 UIGraphicsBeginImageContext(targetSize),这样正确的比例因子才会应用到位图上。

将比例因子设置为 0.0,会将比例因子设置为设备主屏幕的比例因子。 仅调用 UIGraphicsBeginImageContext() 相当于调用 UIGraphicsBeginImageContextWithOptions(..) 并将比例因子设置为 1.0

更多详情请参考:http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIGraphicsBeginImageContextWithOptions


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接