如何使用iOS轻松调整大小/优化图像大小?


114

我的应用程序正在从网络下载一组图像文件,并将它们保存到本地iPhone磁盘。其中一些图像尺寸很大(例如,宽度大于500像素)。由于iPhone甚至没有足够大的显示屏来显示原始尺寸的图像,因此我计划将图像调整为较小的尺寸以节省空间/性能。

另外,其中一些图像是JPEG,因此不会保存为通常的60%质量设置。

如何使用iPhone SDK调整图片的大小,以及如何更改JPEG图像的质量设置?

Answers:


246

提供了一些建议作为对该问题的解答。我已经建议了这篇文章中描述的技术,以及相关的代码:

+ (UIImage*)imageWithImage:(UIImage*)image 
               scaledToSize:(CGSize)newSize;
{
   UIGraphicsBeginImageContext( newSize );
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return newImage;
}

就图像的存储而言,与iPhone配合使用的最快图像格式是PNG,因为它已对该格式进行了优化。但是,如果要将这些图像存储为JPEG,则可以使用UIImage并执行以下操作:

NSData *dataForJPEGFile = UIImageJPEGRepresentation(theImage, 0.6);

这将创建一个NSData实例,其中包含质量设置为60%的JPEG图像的原始字节。然后可以将该NSData实例的内容写入磁盘或缓存在内存中。


1
先生...我写了相同的逻辑,但是右边的plz会出现一条白色的直线(人像),请给我解决方案
Nag_iphone 2011年

1
嗨,调整大小时如何保持纵横比和片段绑定?在我的情况下,当我调整具有不同比例的图像的大小然后与“ newsize”调整大小时,会得到变形的已调整大小的图像。谢谢!
Van Du Tran

1
过去曾奏效,但在iOS5.0.1及更高版本中,这会导致内存泄漏。还有其他方法可以做到这一点吗?
乌斯曼·尼萨尔

推荐使用[image drawInRect:rect blendMode:kCGBlendModeCopy alpha:1.0]来提高性能(因此在绘制过程中绘制不必进行混合计算
cdemiris99 2015年

您应该使用UIGraphicsBeginImageContextWithOptions(size,NO,0.0); 其中0.0将使用主屏幕比例来支持视网膜及以上。苹果公司指出:“通常应避免调用类似名称的UIGraphicsBeginImageContext函数(作为向后兼容性的后备方法除外)”。
布拉德·高斯

65

调整图像大小最简单,最直接的方法就是

float actualHeight = image.size.height;
float actualWidth = image.size.width;
float imgRatio = actualWidth/actualHeight;
float maxRatio = 320.0/480.0;

if(imgRatio!=maxRatio){
    if(imgRatio < maxRatio){
        imgRatio = 480.0 / actualHeight;
        actualWidth = imgRatio * actualWidth;
        actualHeight = 480.0;
    }
    else{
        imgRatio = 320.0 / actualWidth;
        actualHeight = imgRatio * actualHeight;
        actualWidth = 320.0;
    }
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image drawInRect:rect];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

这很漂亮。我能够将发送到服务器的图像从大约1Mb减少到100k,同时仍保持视网膜显示分辨率(尽管我将320.0和480.0的值更改为640.0和1136.0),并且在缩放后也进行了一些JPEG压缩:UIImageJPEGRepresentation(img, 0.7f);
凯勒2012年

2
如果图像比例和最大比例相等,该怎么办?例如,如果iamge大小是3200x4800?
akshay1188 2013年

过去曾奏效,但在iOS5.0.1及更高版本中,这会导致内存泄漏。还有其他方法可以做到这一点吗?
Usman Nisar 2014年

25

上述方法适用于较小的图像,但是当您尝试调整非常大的图像的大小时,将很快耗尽内存并导致应用程序崩溃。更好的方法是使用CGImageSourceCreateThumbnailAtIndex调整图像大小,而无需先完全解码它。

如果您具有要调整大小的图像的路径,则可以使用以下命令:

- (void)resizeImageAtPath:(NSString *)imagePath {
    // Create the image source (from path)
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);

    // To create image source from UIImage, use this
    // NSData* pngData =  UIImagePNGRepresentation(image);
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);

    // Create thumbnail options
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{
            (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
            (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
            (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
    };
    // Generate the thumbnail
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src);
    // Write the thumbnail at path
    CGImageWriteToFile(thumbnail, imagePath);
}

更多细节在这里


谢谢您,此解决方案就像一个咒语一样工作),您知道CGImageSource除图像和pdf之外还支持的其他文件格式吗?
sage444 2015年

谢谢。我一直在寻找inSampleSizeAndroid解码器使用的类似物。这是唯一的答案,它提供了一种以内存有效的方式按比例缩小图像的方法。
斯坦·莫茨

通过直接使用存储中的文件,我获得了很好的结果,还可以使用内存中的图像,但是速度不快(将大图像加载到UIImage中然后进行缩放)。
Kendall Helmstetter Gelner

在共享扩展中不起作用。应用仍然会因为非常大的图像而崩溃。
乔治

18

缩放图像而不损失纵横比(即不拉伸图像)的最佳方法是使用以下方法:

//to scale images without changing aspect ratio
+ (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)newSize {

    float width = newSize.width;
    float height = newSize.height;

    UIGraphicsBeginImageContext(newSize);
    CGRect rect = CGRectMake(0, 0, width, height);

    float widthRatio = image.size.width / width;
    float heightRatio = image.size.height / height;
    float divisor = widthRatio > heightRatio ? widthRatio : heightRatio;

    width = image.size.width / divisor;
    height = image.size.height / divisor;

    rect.size.width  = width;
    rect.size.height = height;

    //indent in case of width or height difference
    float offset = (width - height) / 2;
    if (offset > 0) {
        rect.origin.y = offset;
    }
    else {
        rect.origin.x = -offset;
    }

    [image drawInRect: rect];

    UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return smallImage;

}

将此方法添加到您的Utility类,以便您可以在整个项目中使用它,并按如下方式访问它:

xyzImageView.image = [Utility scaleImage:yourUIImage toSize:xyzImageView.frame.size];

此方法在保持纵横比的同时要注意缩放。万一按比例缩小的图像的宽度大于高度(或反之亦然),还会在图像上添加缩进。


8

如果您可以控制服务器,则强烈建议您使用ImageMagik调整图像服务器端的大小。下载大图像并在手机上调整大小会浪费很多宝贵的资源-带宽,电池和内存。所有这些在手机上都是稀缺的。


2
FTFQ:“我的应用程序正在从网络下载一组图像文件,”
Rog

这可能是一个相关的答案。问题表明正在从网络下载图像。如果OP可以与图像服务器端一起使用,则应该。如果他做不到,回答会有所帮助。
2013年

6

我为Swift中的图像缩放开发了最终的解决方案。

您可以使用它来调整图像大小以填充,宽高比填充或宽高比适合指定的大小。

您可以将图像对齐到中心或四个边缘和四个角中的任何一个。

如果原始图像的纵横比与目标尺寸不相等,您还可以修剪额外的空间。

enum UIImageAlignment {
    case Center, Left, Top, Right, Bottom, TopLeft, BottomRight, BottomLeft, TopRight
}

enum UIImageScaleMode {
    case Fill,
    AspectFill,
    AspectFit(UIImageAlignment)
}

extension UIImage {
    func scaleImage(width width: CGFloat? = nil, height: CGFloat? = nil, scaleMode: UIImageScaleMode = .AspectFit(.Center), trim: Bool = false) -> UIImage {
        let preWidthScale = width.map { $0 / size.width }
        let preHeightScale = height.map { $0 / size.height }
        var widthScale = preWidthScale ?? preHeightScale ?? 1
        var heightScale = preHeightScale ?? widthScale
        switch scaleMode {
        case .AspectFit(_):
            let scale = min(widthScale, heightScale)
            widthScale = scale
            heightScale = scale
        case .AspectFill:
            let scale = max(widthScale, heightScale)
            widthScale = scale
            heightScale = scale
        default:
            break
        }
        let newWidth = size.width * widthScale
        let newHeight = size.height * heightScale
        let canvasWidth = trim ? newWidth : (width ?? newWidth)
        let canvasHeight = trim ? newHeight : (height ?? newHeight)
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(canvasWidth, canvasHeight), false, 0)

        var originX: CGFloat = 0
        var originY: CGFloat = 0
        switch scaleMode {
        case .AspectFit(let alignment):
            switch alignment {
            case .Center:
                originX = (canvasWidth - newWidth) / 2
                originY = (canvasHeight - newHeight) / 2
            case .Top:
                originX = (canvasWidth - newWidth) / 2
            case .Left:
                originY = (canvasHeight - newHeight) / 2
            case .Bottom:
                originX = (canvasWidth - newWidth) / 2
                originY = canvasHeight - newHeight
            case .Right:
                originX = canvasWidth - newWidth
                originY = (canvasHeight - newHeight) / 2
            case .TopLeft:
                break
            case .TopRight:
                originX = canvasWidth - newWidth
            case .BottomLeft:
                originY = canvasHeight - newHeight
            case .BottomRight:
                originX = canvasWidth - newWidth
                originY = canvasHeight - newHeight
            }
        default:
            break
        }
        self.drawInRect(CGRectMake(originX, originY, newWidth, newHeight))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

下面有一些应用此解决方案的示例。

灰色矩形是目标站点图像的大小将被调整为。浅蓝色矩形中的蓝色圆圈是图像(我使用了圆圈,因为在不保留纵横比的情况下很容易看到缩放比例)。如果通过,则浅橙色标记将要修剪的区域trim: true

缩放前后的宽高比拟合

宽高比拟合1(之前) 宽高比拟合1(之后)

方面适合度的另一个示例:

外观适合2(之前) 宽高比适合2(之后)

外观与顶部对齐:

Aspect Fit 3(之前) 宽高比适合3(之后)

外观填充

外观填充(之前) 外观填充(之后)

填写

填写(之前) 填充(之后)

我在示例中使用了升频,因为它更易于演示,但是解决方案也可以按需降阶。

对于JPEG压缩,应使用以下命令:

let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
  // ...
}

您可以通过Xcode游乐场查看我的要点


3

对于Swift 3,以下代码将缩放图像,并保持宽高比。您可以在Apple文档中阅读有关ImageContext的更多信息:

extension UIImage {
    class func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage {
        let scale = newHeight / image.size.height
        let newWidth = image.size.width * scale
        UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
        image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

要使用它,请调用resizeImage()方法:

UIImage.resizeImage(image: yourImageName, newHeight: yourImageNewHeight)

2

您可以使用此代码按要求的尺寸缩放图像。

+ (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)newSize
{
    CGSize actSize = image.size;
    float scale = actSize.width/actSize.height;

    if (scale < 1) {
        newSize.height = newSize.width/scale;
    } 
    else {
        newSize.width = newSize.height*scale;
    }

    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

1

视网膜显示器上可能发生的问题是图像的比例是由ImageCapture设置的。上面的调整大小功能不会改变它。在这些情况下,调整大小将无法正常进行。

在下面的代码中,缩放比例设置为1(未缩放),并且返回的图像具有您期望的尺寸。这是在UIGraphicsBeginImageContextWithOptions通话中完成的。

-(UIImage *)resizeImage :(UIImage *)theImage :(CGSize)theNewSize {
    UIGraphicsBeginImageContextWithOptions(theNewSize, NO, 1.0);
    [theImage drawInRect:CGRectMake(0, 0, theNewSize.width, theNewSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

1

在这里增加了很多答案,但是我已经找到了一种解决方案,该解决方案根据文件大小而不是尺寸来调整大小。

这将减小图像的尺寸和质量,直到达到您指定的尺寸为止。

func compressTo(toSizeInMB size: Double) -> UIImage? {
    let bytes = size * 1024 * 1024
    let sizeInBytes = Int(bytes)
    var needCompress:Bool = true
    var imgData:Data?
    var compressingValue:CGFloat = 1.0

    while (needCompress) {

        if let resizedImage = scaleImage(byMultiplicationFactorOf: compressingValue), let data: Data = UIImageJPEGRepresentation(resizedImage, compressingValue) {

            if data.count < sizeInBytes || compressingValue < 0.1 {
                needCompress = false
                imgData = data
            } else {
                compressingValue -= 0.1
            }
        }
    }

    if let data = imgData {
        print("Finished with compression value of: \(compressingValue)")
        return UIImage(data: data)
    }
    return nil
}

private func scaleImage(byMultiplicationFactorOf factor: CGFloat) -> UIImage? {
    let size = CGSize(width: self.size.width*factor, height: self.size.height*factor)
    UIGraphicsBeginImageContext(size)
    draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    if let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() {
        UIGraphicsEndImageContext()
        return newImage;
    }
    return nil
}

信贷按大小缩放答案


1

迅捷版

func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? {

    let scale = newWidth / image.size.width
    let newHeight = CGFloat(200.0)
    UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
    image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

1

根据这次会议,iOS Memory Deep Dive,我们最好使用ImageIO来缩小图像。

使用UIImage缩小图像的缺点。

  • 将原始图像解压缩到内存中
  • 内部坐标空间变换很昂贵

ImageIO

  • ImageIO可以读取图像大小和元数据信息,而不会弄脏内存。

  • ImageIO可以仅以调整图像大小为代价调整图像大小。

关于内存中的图像

  • 内存使用与图像尺寸有关,与文件大小无关。
  • UIGraphicsBeginImageContextWithOptions始终使用SRGB渲染格式,每个像素使用4个字节。
  • 有图像 load -> decode -> render 3个阶段。
  • UIImage 调整大小和调整大小是昂贵的

对于以下图像,如果使用,则UIGraphicsBeginImageContextWithOptions 仅需要590KB即可加载图像,而2048 pixels x 1536 pixels x 4 bytes per pixel解码时需要 = 10MB 在此处输入图片说明

UIGraphicsImageRendereriOS 10中引入的会自动选择iOS12中的最佳图形格式。这意味着,您可以通过替换UIGraphicsBeginImageContextWithOptions为来节省75%的内存UIGraphicsImageRenderer如果不需要SRGB。

这是我有关内存中的iOS图像的文章

func resize(url: NSURL, maxPixelSize: Int) -> CGImage? {
    let imgSource = CGImageSourceCreateWithURL(url, nil)
    guard let imageSource = imgSource else {
        return nil
    }

    var scaledImage: CGImage?
    let options: [NSString: Any] = [
            // The maximum width and height in pixels of a thumbnail.
            kCGImageSourceThumbnailMaxPixelSize: maxPixelSize,
            kCGImageSourceCreateThumbnailFromImageAlways: true,
            // Should include kCGImageSourceCreateThumbnailWithTransform: true in the options dictionary. Otherwise, the image result will appear rotated when an image is taken from camera in the portrait orientation.
            kCGImageSourceCreateThumbnailWithTransform: true
    ]
    scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary)

    return scaledImage
}


let filePath = Bundle.main.path(forResource:"large_leaves_70mp", ofType: "jpg")

let url = NSURL(fileURLWithPath: filePath ?? "")

let image = resize(url: url, maxPixelSize: 600)

要么

// Downsampling large images for display at smaller size
func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage {
    let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
    let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions)!
    let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale
    let downsampleOptions =
        [kCGImageSourceCreateThumbnailFromImageAlways: true,
        kCGImageSourceShouldCacheImmediately: true,
        // Should include kCGImageSourceCreateThumbnailWithTransform: true in the options dictionary. Otherwise, the image result will appear rotated when an image is taken from camera in the portrait orientation.
        kCGImageSourceCreateThumbnailWithTransform: true,
        kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionary
    let downsampledImage =
        CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions)!
    return UIImage(cgImage: downsampledImage)
}

0

我最终使用Brads技术创建了一个对任何人都有用的scaleToFitWidth方法UIImage+Extensions...

-(UIImage *)scaleToFitWidth:(CGFloat)width
{
    CGFloat ratio = width / self.size.width;
    CGFloat height = self.size.height * ratio;

    NSLog(@"W:%f H:%f",width,height);

    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    [self drawInRect:CGRectMake(0.0f,0.0f,width,height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

那你喜欢的地方

#import "UIImage+Extensions.h"

UIImage *newImage = [image scaleToFitWidth:100.0f];

同样值得注意的是,UIView+Extensions如果要从UIView渲染图像,则可以将其进一步下移到类中


0

我只是想为Cocoa Swift程序员回答这个问题。此函数返回具有新大小的NSImage。您可以像这样使用该功能。

        let sizeChangedImage = changeImageSize(image, ratio: 2)






 // changes image size

    func changeImageSize (image: NSImage, ratio: CGFloat) -> NSImage   {

    // getting the current image size
    let w = image.size.width
    let h = image.size.height

    // calculating new size
    let w_new = w / ratio 
    let h_new = h / ratio 

    // creating size constant
    let newSize = CGSizeMake(w_new ,h_new)

    //creating rect
    let rect  = NSMakeRect(0, 0, w_new, h_new)

    // creating a image context with new size
    let newImage = NSImage.init(size:newSize)



    newImage.lockFocus()

        // drawing image with new size in context
        image.drawInRect(rect)

    newImage.unlockFocus()


    return newImage

}

0

如果图像在文档目录中,请添加此URL扩展名:

extension URL {
    func compressedImageURL(quality: CGFloat = 0.3) throws -> URL? {
        let imageData = try Data(contentsOf: self)
        debugPrint("Image file size before compression: \(imageData.count) bytes")

        let compressedURL = NSURL.fileURL(withPath: NSTemporaryDirectory() + NSUUID().uuidString + ".jpg")

        guard let actualImage = UIImage(data: imageData) else { return nil }
        guard let compressedImageData = UIImageJPEGRepresentation(actualImage, quality) else {
            return nil
        }
        debugPrint("Image file size after compression: \(compressedImageData.count) bytes")

        do {
            try compressedImageData.write(to: compressedURL)
            return compressedURL
        } catch {
            return nil
        }
    }
}

用法:

guard let localImageURL = URL(string: "< LocalImagePath.jpg >") else {
    return
}

//Here you will get URL of compressed image
guard let compressedImageURL = try localImageURL.compressedImageURL() else {
    return
}

debugPrint("compressedImageURL: \(compressedImageURL.absoluteString)")

注意:-用本地jpg图像路径更改<LocalImagePath.jpg>。


-1

如果有人还在寻找更好的选择

-(UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize {


    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;
        else
            scaleFactor = heightFactor;

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


    // this is actually the interesting part:

    UIGraphicsBeginImageContext(targetSize);

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

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(newImage == nil) NSLog(@"could not scale image");


    return newImage ;

}

-1
- (UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize {
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
    CGImageRef imageRef = image.CGImage;

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height);

    CGContextConcatCTM(context, flipVertical);
    CGContextDrawImage(context, newRect, imageRef);

    CGImageRef newImageRef = CGBitmapContextCreateImage(context);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    CGImageRelease(newImageRef);
    UIGraphicsEndImageContext();

    return newImage;
}

请在您的答案中至少提供一些代码解释。并使用答案编辑器格式化代码以使其可读。
xpereta

-2

要调整图像大小,可以使用此函数代替DrawInRect获得更好的(图形)结果:

- (UIImage*) reduceImageSize:(UIImage*) pImage newwidth:(float) pWidth
{
    float lScale = pWidth / pImage.size.width;
    CGImageRef cgImage = pImage.CGImage;
    UIImage   *lResult = [UIImage imageWithCGImage:cgImage scale:lScale
                            orientation:UIImageOrientationRight];
    return lResult;
}

长宽比会自动照顾

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.