1。图片压缩到指定大小
+(UIImage *)compressImageSize:(UIImage *)image toByte:(NSUInteger)maxLength{
CGFloat compression = 1;
NSData *data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength) return image;
CGFloat max = 1;
CGFloat min = 0;
for (int i = 0; i < 6; ++i) {
compression = (max + min) / 2;
data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength * 0.9) {
min = compression;
} else if (data.length > maxLength) {
max = compression;
} else {
break;
}
}
UIImage *resultImage = [UIImage imageWithData:data];
if (data.length < maxLength) return resultImage;
// Compress by size
NSUInteger lastDataLength = 0;
while (data.length > maxLength && data.length != lastDataLength) {
lastDataLength = data.length;
CGFloat ratio = (CGFloat)maxLength / data.length;
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
(NSUInteger)(resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank
UIGraphicsBeginImageContext(size);
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
data = UIImageJPEGRepresentation(resultImage, compression);
}
return resultImage;
}
2.图片压缩到指定宽度
+(UIImage*)compressImage:(UIImage*)sourceImage toTargetWidth:(CGFloat)targetWidth {
//获取原图片的大小尺寸
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
//根据目标图片的宽度计算目标图片的高度
CGFloat targetHeight = (targetWidth / width) * height;
//开启图片上下文
UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
//绘制图片
[sourceImage drawInRect:CGRectMake(0,0, targetWidth, targetHeight)];
//从上下文中获取绘制好的图片
UIImage*newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭图片上下文
UIGraphicsEndImageContext();
return newImage;
}
3.获取网络图片尺寸
+ (CGSize)getImageSizeWithURL:(id)URL
{
NSURL * url = nil;
if ([URL isKindOfClass:[NSURL class]]) {
url = URL;
}
if ([URL isKindOfClass:[NSString class]]) {
url = [NSURL URLWithString:URL];
}
if (!URL) {
return CGSizeZero;
}
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
CGFloat width = 0, height = 0;
if (imageSourceRef) {
// 获取图像属性
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
//以下是对手机32位、64位的处理
if (imageProperties != NULL) {
CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
#if defined(__LP64__) && __LP64__
if (widthNumberRef != NULL) {
CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
}
CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
if (heightNumberRef != NULL) {
CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
}
#else
if (widthNumberRef != NULL) {
CFNumberGetValue(widthNumberRef, kCFNumberFloat32Type, &width);
}
CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
if (heightNumberRef != NULL) {
CFNumberGetValue(heightNumberRef, kCFNumberFloat32Type, &height);
}
#endif
/***************** 此处解决返回图片宽高相反问题 *****************/
// 图像旋转的方向属性
NSInteger orientation = [(__bridge NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyOrientation) integerValue];
CGFloat temp = 0;
switch (orientation) { // 如果图像的方向不是正的,则宽高互换
case UIImageOrientationLeft: // 向左逆时针旋转90度
case UIImageOrientationRight: // 向右顺时针旋转90度
case UIImageOrientationLeftMirrored: // 在水平翻转之后向左逆时针旋转90度
case UIImageOrientationRightMirrored: { // 在水平翻转之后向右顺时针旋转90度
temp = width;
width = height;
height = temp;
}
break;
default:
break;
}
/***************** 此处解决返回图片宽高相反问题 *****************/
CFRelease(imageProperties);
}
CFRelease(imageSourceRef);
}
return CGSizeMake(width, height);
}
4.裁剪 指定区域饿的图片
+(UIImage*)tailoringImage:(UIImage*)img Area:(CGRect)area{
CGImageRef sourceImageRef = [img CGImage];//将UIImage转换成CGImageRef
CGRect rect = CGRectMake(area.origin.x, area.origin.y, area.size.width, area.size.height);
CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);//按照给定的矩形区域进行剪裁
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
return newImage;
}
5.裁剪到指定宽高
- (UIImage *)imageScaleWithImage:(UIImage*) image
withWidth:(CGFloat ) width
withHeight:(CGFloat) height
{
if (!image) {
return nil;
}
EAGLContext *previousContext = [EAGLContext currentContext];
[EAGLContext setCurrentContext:nil];
CIImage *ciimage = [CIImage imageWithCGImage:image.CGImage];
CGFloat imageWidth = ciimage.extent.size.width;//需要取UIimage里面的CIImage 的宽高
CGFloat imageHeight = ciimage.extent.size.height;
CGFloat srcRatio = imageWidth/(imageHeight*1.0);
CGFloat desRatio = width/(height*1.0);
CIContext *context = [CIContext contextWithOptions:nil];
//scale
CGFloat scale = srcRatio < desRatio ? (width/imageWidth) : (height/imageHeight);
ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(scale, scale)];
CGRect extent = ciimage.extent;
CGRect resultRect = CGRectMake(extent.origin.x+(extent.size.width - width)/2, extent.origin.y+(extent.size.height - height)/2, width, height);
CGImageRef ref = [context createCGImage:ciimage fromRect:resultRect];
UIImage *resultImage = [UIImage imageWithCGImage:ref];
[EAGLContext setCurrentContext:previousContext];
return resultImage;
}