zoukankan      html  css  js  c++  java
  • iPhone处理图片(UIImage扩展类) 自动适应frame大小方法

    NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"图片地址"]];

    UIImage *tempImg = [UIImage imageWithData:imgData];

    UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(15, 20, 60, 80)];

    img.image = tempImg;

    //[img initWithImage:tempImg]; 用这个不行,为什么?

    [tempImg rescaleImageToSize:CGSizeMake(60, 80)];

    [self.view addSubView: img];

     

    下面这个方法 可以改变图片大小 自适应,自己传参数吧

    - (UIImage *)rescaleImageToSize:(CGSize)size {

    CGRect rect = CGRectMake(0.0, 0.0, size.width, size.height);

    UIGraphicsBeginImageContext(rect.size);

    [self drawInRect:rect];  // scales image to rect

    UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return resImage;

    }

    - (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize;   //图片缩放裁剪

    - (UIImage*)transformWidth:(CGFloat)width      height:(CGFloat)height; //变大小

    + (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2; //合并图片

    + (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect; //裁剪部分图片

    + (void)imageSavedToPhotosAlbum:(UIImage *)image

    didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;  //保存图片到媒体库

    UIImageExtras

    关于图片缩放的线程安全和非线程安全操作.

    线程安全的操作只能在主线程中进行操作,对于大图片的处理肯定会消耗大量的时间,如下面的方法

    方法 1 使用 UIKit

    + (UIImage*)imageWithImage :( UIImage*)image scaledToSize :(CGSize)newSize;

    {

    // Create a graphics image context

    UIGraphicsBeginImageContext(newSize);

    // Tell the old image to draw in this new context, with the desired

    // new size

    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    // Get the new image from the context

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

    // End the context

    UIGraphicsEndImageContext();

    // Return the new image.

    return newImage;

    }

    此方法很简单, 但是这种方法不是线程安全的情况下.

    方法 2 使用 CoreGraphics

    + (UIImage*)imageWithImage :( UIImage*)sourceImage scaledToSize :(CGSize)newSize;

    {

    CGFloat targetWidth = targetSize.width;

    CGFloat targetHeight = targetSize.height;

    CGImageRef imageRef = [sourceImage CGImage];

    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);

    CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);

    if (bitmapInfo == kCGImageAlphaNone) {

    bitmapInfo = kCGImageAlphaNoneSkipLast;

    }

    CGContextRef bitmap;

    if (sourceImage.imageOrientation == UIImageOrientationUp ||sourceImage.imageOrientation == UIImageOrientationDown) {

    bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    } else {

    bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    }

    if (sourceImage.imageOrientation == UIImageOrientationLeft) {

    CGContextRotateCTM (bitmap, radians(90));

    CGContextTranslateCTM (bitmap, 0, -targetHeight);

    } else if (sourceImage.imageOrientation ==UIImageOrientationRight) {

    CGContextRotateCTM (bitmap, radians(-90));

    CGContextTranslateCTM (bitmap, -targetWidth, 0);

    } else if (sourceImage.imageOrientation == UIImageOrientationUp) {

    // NOTHING

    } else if (sourceImage.imageOrientation == UIImageOrientationDown){

    CGContextTranslateCTM (bitmap, targetWidth, targetHeight);

    CGContextRotateCTM (bitmap, radians(-180.));

    }

    CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth,targetHeight), imageRef);

    CGImageRef ref = CGBitmapContextCreateImage(bitmap);

    UIImage* newImage = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);

    CGImageRelease(ref);

    return newImage;

    }

    这种方法的好处是它是线程安全,加上它负责的 (使用正确的颜色空间和位图信息,处理图像方向) 的小东西,UIKit 版本不会。

    如何调整和保持长宽比 (如 AspectFill 选项)?

    它是非常类似于上述,方法,它看起来像这样:

    + (UIImage*)imageWithImage :( UIImage*)sourceImage scaledToSizeWithSameAspectRatio :( CGSize)targetSize;

    {

    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.= (targetHeight - scaledHeight) * 0.5;

    }

    else if (widthFactor < heightFactor) {

    thumbnailPoint.= (targetWidth - scaledWidth) * 0.5;

    }

    }

    CGImageRef imageRef = [sourceImage CGImage];

    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);

    CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);

    if (bitmapInfo == kCGImageAlphaNone) {

    bitmapInfo = kCGImageAlphaNoneSkipLast;

    }

    CGContextRef bitmap;

    if (sourceImage.imageOrientation == UIImageOrientationUp ||sourceImage.imageOrientation == UIImageOrientationDown) {

    bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    } else {

    bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);

    }

    // In the right or left cases, we need to switch scaledWidth and scaledHeight,

    // and also the thumbnail point

    if (sourceImage.imageOrientation == UIImageOrientationLeft) {

    thumbnailPoint = CGPointMake(thumbnailPoint.y, thumbnailPoint.x);

    CGFloat oldScaledWidth = scaledWidth;

    scaledWidth = scaledHeight;

    scaledHeight = oldScaledWidth;

    CGContextRotateCTM (bitmap, radians(90));

    CGContextTranslateCTM (bitmap, 0, -targetHeight);

    } else if (sourceImage.imageOrientation ==UIImageOrientationRight) {

    thumbnailPoint = CGPointMake(thumbnailPoint.y, thumbnailPoint.x);

    CGFloat oldScaledWidth = scaledWidth;

    scaledWidth = scaledHeight;

    scaledHeight = oldScaledWidth;

    CGContextRotateCTM (bitmap, radians(-90));

    CGContextTranslateCTM (bitmap, -targetWidth, 0);

    } else if (sourceImage.imageOrientation == UIImageOrientationUp) {

    // NOTHING

    } else if (sourceImage.imageOrientation == UIImageOrientationDown){

    CGContextTranslateCTM (bitmap, targetWidth, targetHeight);

    CGContextRotateCTM (bitmap, radians(-180.));

    }

    CGContextDrawImage(bitmap, CGRectMake(thumbnailPoint.x,thumbnailPoint.y, scaledWidth, scaledHeight), imageRef);

    CGImageRef ref = CGBitmapContextCreateImage(bitmap);

    UIImage* newImage = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);

    CGImageRelease(ref);

    return newImage;

    } 

  • 相关阅读:
    按列数自动换行
    百度C 语言吧 · 问题资料大全
    最新动态.某美女象山旅游计划
    被点名了,玩个游戏。
    我们仍未知道那天所看见的题的解法 1
    我们仍未知道那天所看见的题的解法 2
    算法初探 平衡树
    排列组合
    HttpRunner2.X开源接口测试框架学习(一):介绍与安装
    jmeter基础一:JMeter的主要测试组件总结
  • 原文地址:https://www.cnblogs.com/chen1987lei/p/2549556.html
Copyright © 2011-2022 走看看