iOS開發>學無止境 - UIImage等比縮放


 

評論功能真不錯

評論開通后,果然有很多人吐槽。謝謝大家的支持和關愛,如果有做的不到的地方,還請海涵。畢竟我一個人的力量是有限的,我會盡自己最大的努力大家准備一些干貨。

有些內容可能都是比較基礎的,記住:不積跬步無以至千里,不積小流無以成江海。我想這個道理大家都懂,在為大家准備文章的過程中,對我來說也是一次學習成長。

大家可以繼續吐槽!微信的評論就是一個溝通的渠道,也是一篇文章的延續。你也可以在評論中寫一些你對iOS開發的見解,說不定就會對他人有幫助。

很高興,已經有好幾位iOS開發的朋友答應以后會寫文章投稿給我。在這里,我再強調一下:如果你有好的技術文章一定要投稿給我噢!投稿郵箱:

worldligang@163.com

前面講了截取UIImage指定大小區域,很方便的截取UIImage。今天要和大家分享的是UIImage的縮放。

兩種縮放:

  1. 縮放到指定大小,也就是指定的size.

  2. 等比縮放。

縮放到指定大小

- (UIImage*)imageCompressWithSimple:(UIImage*)image scaledToSize:(CGSize)size
{
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0,0,size.width,size.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

等比縮放

通過縮放系數

- (UIImage*)imageCompressWithSimple:(UIImage*)image scale:(float)scale
{
    CGSize size = image.size;
    CGFloat width = size.width;
    CGFloat height = size.height;
    CGFloat scaledWidth = width * scale;
    CGFloat scaledHeight = height * scale;
    UIGraphicsBeginImageContext(size); // this will crop
    [image drawInRect:CGRectMake(0,0,scaledWidth,scaledHeight)];
    UIImage* newImage= UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

scale是縮放系數 。

通過計算得到縮放系數

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
{

    UIImage *sourceImage = [UIImage imageNamed:@"test.jpg"];
    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;

}

很久之前寫了一篇文章解決MWPhotoBrowser中的SDWebImage加載大圖導致的內存警告問題。這個我記得當時從服務器拿到的照片大概有10幾M的樣子,加載出來會導致內存警告。所以我當時通過修改SDWebImage源碼,就是把下載下來的照片進行縮放,內存就降下來了。

一般情況下應該不會加載這么大的照片的,用戶要是知道,早把你的APP給刪掉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM