ios中图像进行压缩方法汇总

ios中图像进行压缩方法汇总

  在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需 要图片引用作为参数.

  方法一:

  代码如下:

  - (UIImage*)scaleFromImage:(UIImage*)image scaledToSize:(CGSize)newSize

  {

  CGSize imageSize = image.size;

  CGFloat width = imageSize.width;

  CGFloat height = imageSize.height;

  if (width <= newSize.width && height <= newSize.height){

  return image;

  }

  if (width == 0 || height == 0){

  return image;

  }

  CGFloat widthFactor = newSize.width / width;

  CGFloat heightFactor = newSize.height / height;

  CGFloat scaleFactor = (widthFactor

  CGFloat scaledWidth = width * scaleFactor;

  CGFloat scaledHeight = height * scaleFactor;

  CGSize targetSize = CGSizeMake(scaledWidth,scaledHeight);

  UIGraphicsBeginImageContext(targetSize);

  [image drawInRect:CGRectMake(0,0,scaledWidth,scaledHeight)];

  UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  return newImage;

  }

  方法二:

  .h具体code

   代码如下:

  #import

  @interface UIImage (UIImageExt)

  - (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size;

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

  @end

  .m具体code

   代码如下:

  #import "UIImageExt.h"

  @implementation UIImage (UIImageExt)

  - (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{

  // 创建一个bitmap的context

  // 并把它设置成为当前正在使用的context

  UIGraphicsBeginImageContext(size);

  // 绘制改变大小的图片

  [img drawInRect:CGRectMake(0, 0, size.width, size.height)];

  // 从当前context中创建一个改变大小后的图片

  UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();

  // 使当前的context出堆栈

  UIGraphicsEndImageContext();

  // 返回新的改变大小后的图片

  return scaledImage;

  }

  - (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize

  {

  UIImage *sourceImage = self;

  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;

  }

  @end

  方法三:(本人项目中使用的方法)

   代码如下:

  -(UIImage *) imageCompressForWidth:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth

  {

  CGSize imageSize = sourceImage.size;

  CGFloat width = imageSize.width;

  CGFloat height = imageSize.height;

  CGFloat targetWidth = defineWidth;

  CGFloat targetHeight = (targetWidth / width) * height;

  UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));

  [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)];

  UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  return newImage;

  }

时间: 2024-10-20 12:51:18

ios中图像进行压缩方法汇总的相关文章

iOS中数组遍历的方法及比较

数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为iOS是兼容C语言的,所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系统的语言数组,大约有30多个数据,虽然还不够模拟大批量的数据,但对于方法的验证是没有问题的了. NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 第一种方法

【转载】机器学习中的相似性度量,方法汇总对比

机器学习中的相似性度量,方法汇总对比 人工智能  林  1周前 (01-10)  876℃  0评论 作者:苍梧 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance).采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否. 本文的目的就是对常用的相似性度量作一个总结. 本文目录: 1. 欧氏距离 2. 曼哈顿距离 3. 切比雪夫距离 4. 闵可夫斯基距离 5. 标准化欧氏距离 6. 马

IOS中block的使用方法

X.1 初探Block 在这一小节我们先用一些简单范例来导入block的概念. X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面章节所介绍的简单述句,因为整个定义必须是一个完整的句子,所以必须在最后面加上分号),下面是一个block的范例: 1: int multiplier = 7 ; 2: int (^myBlock)( int ) = ^( int num) 3:

iOS中解析json多种方法

我感觉JSON解析,重要的是JSON解析之后对结果的处理JSON解析后是个dictionary,但是字典中有可能包含字典和数组,数组中还可以包含字典.向客户端请求的返回数据解析下面就简单介绍一下JSON解析过程其实就一句话 "data就是解析数据"!!!!!!!!!!!!!! //xcode自带解析类NSJSONSerialization从data中解析出数据放到字典中NSDictionary *weatherDic = [NSJSONSerialization JSONObjectW

iOS中数组遍历的方法及比較

数组遍历是编码中非经常见的一种需求.我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 由于iOS是兼容C语言的.所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系统的语言数组,大约有30多个数据.尽管还不够模拟大批量的数据.但对于方法的验证是没有问题的了. NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 第一种方

iOS中数组的排序方法

1函数介绍与实例 函数一:- (void)sortUsingSelector:(SEL)comparator; 适用于数组中的元素自带比较函数时: 数组排序函数,调用该函数的对象为数组,comparator是调用该函数的数组中的元素的方法.函数参数类型为数组中的元素类型或者id类型,在调用时不需要传递参数,排序过程不可见,该函数执行时:循环取出各个元素,进行比较,然后放到合适的位置 使用实例: 将数组中的元素按照字符串大小排序: NSMutableArray*array = [[NSMutabl

iOS中使用ZipArchive 压缩和解压缩文件

引自 http://www.36duo.com/thread-119-1-1.html 在本教程中,我将演示如何在iOS程序中压缩和解压缩文件.我们将使用一个叫做ZipArchive的第三方库来实现.尽管压缩和解压缩有许多其他的方案可选,但是我觉得ZipArchive库是最快捷.最简单的解决方案.let’s go. 为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WI

iOS中使用ZipArchive压缩和解压缩文件-备

为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用户只能下载小于50M的应用或游戏.这样一来,对于一些数据或数据包较大的应用,我们只能尽量减小 应用二进制包的体积.而把数据打包到zip中,这样App可以通过网络下载数据包,解压出所需要的内容,而且这样也可以动态的更新内容. 动态更新内容 这 一点在上面已经提过了.如果应用所需要的资源需要动态更新,一

iOS中 三种随机数方法详解

ios 有如下三种随机数方法: 1 2 3 4 5 6 7 8 9 10 //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(time(0)); int i = random() % 5; //第三种 int i = arc4random() % 5 ; 注: ① rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一