1 窗口大小获取: 2 3 CGRect screenBounds = [ [UIScreenmainScreen]bounds];//返回的是带有状态栏的Rect 4 5 CGRect rect = [ [UIScreenmainScreen]applicationFrame];//不包含状态栏的Rect 6 7 UIImageView: 8 9 一 :圆角以及自适应图片大小 10 11 UIImage* image = [UIImage imageNamed:@"image.png"]; 12 13 UIImageView* imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; 14 15 imageView.frame = CGRectMake(0, 0, 300, 200); 16 17 imageView.layer.cornerRadius = 8; 18 19 imageView.layer.masksToBounds = YES; 20 21 //自适应图片宽高比例 22 23 imageView1.contentMode = UIViewContentModeScaleAspectFit; 24 25 二 图片自适应UIImageView 26 27 - (UIImage *)rescaleImageToSize:(CGSize)size { 28 29 CGRect rect = CGRectMake(0.0, 0.0, size.width, size.height); 30 31 UIGraphicsBeginImageContext(rect.size); 32 33 [self drawInRect:rect]; // scales image to rect 34 35 UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext(); 36 37 UIGraphicsEndImageContext(); 38 39 return resImage; 40 41 } 42 43 - (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize; //图片缩放裁剪 44 45 - (UIImage*)transformWidth:(CGFloat)width height:(CGFloat)height; //改变大小 46 47 + (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2; //合并图片 48 49 + (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect; //裁剪部分图片 50 51 + (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo; //保存图片到媒体库 52 53 关于图片缩放的线程安全和非线程安全操作. 54 55 非线程安全的操作只能在主线程中进行操作,对于大图片的处理肯定会消耗大量的时间,如下面的方法 56 57 方法 1: 使用 UIKit 58 59 + (UIImage*)imageWithImage :( UIImage*)image scaledToSize :(CGSize)newSize; 60 { 61 // Create a graphics image context 62 UIGraphicsBeginImageContext(newSize); 63 64 // Tell the old image to draw in this new context, with the desired 65 // new size 66 [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 67 68 // Get the new image from the context 69 UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 70 71 // End the context 72 UIGraphicsEndImageContext(); 73 74 // Return the new image. 75 return newImage; 76 77 } 78 79 此方法很简单, 但是,这种方法不是线程安全的情况下. 80 81 方法 2: 使用 CoreGraphics 82 83 + (UIImage*)imageWithImage :( UIImage*)sourceImage scaledToSize :(CGSize)newSize; 84 { 85 86 87 CGFloat targetWidth = targetSize.width; 88 CGFloat targetHeight = targetSize.height; 89 CGImageRef imageRef = [sourceImage CGImage]; 90 CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); 91 CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef); 92 if (bitmapInfo == kCGImageAlphaNone) { 93 bitmapInfo = kCGImageAlphaNoneSkipLast; 94 95 } 96 97 CGContextRef bitmap; 98 99 if (sourceImage.imageOrientation == UIImageOrientationUp ||sourceImage.imageOrientation == UIImageOrientationDown) { 100 bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo) 101 102 } else { 103 104 bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); 105 } 106 107 if (sourceImage.imageOrientation == UIImageOrientationLeft) { 108 CGContextRotateCTM (bitmap, radians(90)); 109 CGContextTranslateCTM (bitmap, 0, -targetHeight); 110 111 } else if (sourceImage.imageOrientation ==UIImageOrientationRight) { 112 CGContextRotateCTM (bitmap, radians(-90)); 113 CGContextTranslateCTM (bitmap, -targetWidth, 0); 114 115 } else if (sourceImage.imageOrientation == UIImageOrientationUp) { 116 117 // NOTHING 118 119 } else if (sourceImage.imageOrientation == UIImageOrientationDown){ 120 121 CGContextTranslateCTM (bitmap, targetWidth, targetHeight); 122 CGContextRotateCTM (bitmap, radians(-180.)); 123 124 } 125 126 CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth,targetHeight), imageRef); 127 CGImageRef ref = CGBitmapContextCreateImage(bitmap); 128 UIImage* newImage = [UIImage imageWithCGImage:ref]; 129 CGContextRelease(bitmap); 130 CGImageRelease(ref); 131 return newImage; 132 } 133 134 这种方法的好处是它是线程安全,加上它负责的 (使用正确的颜色空间和位图信息,处理图像方向) 的小东西,UIKit 版本不会。 135 如何调整和保持长宽比 (如 AspectFill 选项)? 136 它是非常类似于上述,方法,它看起来像这样: 137 138 + (UIImage*)imageWithImage :( UIImage*)sourceImage scaledToSizeWithSameAspectRatio :( CGSize)targetSize; 139 { 140 CGSize imageSize = sourceImage.size; 141 CGFloat width = imageSize.width; 142 CGFloat height = imageSize.height; 143 CGFloat targetWidth = targetSize.width; 144 CGFloat targetHeight = targetSize.height; 145 CGFloat scaleFactor = 0.0; 146 CGFloat scaledWidth = targetWidth; 147 CGFloat scaledHeight = targetHeight; 148 CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 149 if (CGSizeEqualToSize(imageSize, targetSize) == NO) { 150 CGFloat widthFactor = targetWidth / width; 151 CGFloat heightFactor = targetHeight / height; 152 if (widthFactor > heightFactor) { 153 scaleFactor = widthFactor; // scale to fit height 154 } 155 else { 156 scaleFactor = heightFactor; // scale to fit width 157 } 158 scaledWidth = width * scaleFactor; 159 scaledHeight = height * scaleFactor; 160 // center the image 161 if (widthFactor > heightFactor) { 162 thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 163 } 164 else if (widthFactor < heightFactor) { 165 thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 166 } 167 } 168 CGImageRef imageRef = [sourceImage CGImage]; 169 CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); 170 CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef); 171 if (bitmapInfo == kCGImageAlphaNone) { 172 bitmapInfo = kCGImageAlphaNoneSkipLast; 173 } 174 CGContextRef bitmap; 175 if (sourceImage.imageOrientation == UIImageOrientationUp ||sourceImage.imageOrientation == UIImageOrientationDown) { 176 bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); 177 } else { 178 bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); 179 } 180 181 182 // In the right or left cases, we need to switch scaledWidth and scaledHeight, 183 // and also the thumbnail point 184 if (sourceImage.imageOrientation == UIImageOrientationLeft) { 185 thumbnailPoint = CGPointMake(thumbnailPoint.y, thumbnailPoint.x); 186 CGFloat oldScaledWidth = scaledWidth; 187 scaledWidth = scaledHeight; 188 scaledHeight = oldScaledWidth; 189 CGContextRotateCTM (bitmap, radians(90)); 190 CGContextTranslateCTM (bitmap, 0, -targetHeight); 191 } else if (sourceImage.imageOrientation ==UIImageOrientationRight) { 192 thumbnailPoint = CGPointMake(thumbnailPoint.y, thumbnailPoint.x); 193 CGFloat oldScaledWidth = scaledWidth; 194 scaledWidth = scaledHeight; 195 scaledHeight = oldScaledWidth; 196 CGContextRotateCTM (bitmap, radians(-90)); 197 CGContextTranslateCTM (bitmap, -targetWidth, 0); 198 } else if (sourceImage.imageOrientation == UIImageOrientationUp) { 199 200 // NOTHING 201 202 } else if (sourceImage.imageOrientation == UIImageOrientationDown){ 203 CGContextTranslateCTM (bitmap, targetWidth, targetHeight); 204 CGContextRotateCTM (bitmap, radians(-180.)); 205 } 206 207 CGContextDrawImage(bitmap, CGRectMake(thumbnailPoint.x,thumbnailPoint.y, scaledWidth, scaledHeight), imageRef); 208 CGImageRef ref = CGBitmapContextCreateImage(bitmap); 209 UIImage* newImage = [UIImage imageWithCGImage:ref]; 210 CGContextRelease(bitmap); 211 CGImageRelease(ref); 212 return newImage; 213 } 214 215