(0031) iOS 开发之图片压缩

来源:互联网 发布:数据质量责任追究制度 编辑:程序博客网 时间:2024/06/15 19:10

1. Aspect单词的, 都会按照图片的宽高比来拉伸.这样会显示不全照片

2. Scale单词的,都会对图片进行拉伸(缩放);

3. 没有出现Scale单词的,都不会对图片进行拉伸;


UIViewContentModeScaleToFill

http://blog.csdn.net/iotjin/article/details/49159537


  // 图片压缩,因为原图都是很大的,不必要传原图
  UIImage *scaleImage = [self scaleImage:originImage toScale:0.3];

  // 以下这两步都是比较耗时的操作,最好开一个HUD提示用户,这样体验会好些,不至于阻塞界面
  if (UIImagePNGRepresentation(scaleImage) == nil) {
     // 将图片转换为JPG格式的二进制数据
     data = UIImageJPEGRepresentation(scaleImage, 1);
  } else {
     // 将图片转换为PNG格式的二进制数据
     data = UIImagePNGRepresentation(scaleImage);
  }
  // 将二进制数据生成UIImage
  UIImage *image = [UIImage imageWithData:data];


- (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
{   
UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*s caleSize));

   [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height *scaleSize)];
   UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
   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;

        } elseif (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;

}


(UIImage *)compressImage:(UIImage *)image toMaxFileSize:(NSInteger)maxFileSize

{

    CGFloat compression =0.9f;

    CGFloat maxCompression =0.1f;

    NSData *imageData = UIImageJPEGRepresentation(image, compression);

    while ([imageData length] > maxFileSize && compression > maxCompression) {

        compression -= 0.1;

        imageData = UIImageJPEGRepresentation(image, compression);

    }

    

    UIImage *compressedImage = [UIImage imageWithData:imageData];

    return compressedImage;

}


// 压缩图片到指定文件大小    

//  @param image:目标图片    size目标大小:(最大值)@return 返回的图片文件

+ (NSData *)compressOriginalImage:(UIImage *)image toMaxDataSizeKBytes:(CGFloat)size
{
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    CGFloat dataKBytes = data.length/1000.0;
    CGFloat maxQuality = 0.9f;
    CGFloat lastData = dataKBytes;
    while (dataKBytes > size && maxQuality > 0.01f) {
        maxQuality = maxQuality - 0.01f;
        data = UIImageJPEGRepresentation(image, maxQuality);
        dataKBytes = data.length/1000.0;
        if (lastData == dataKBytes) {
            break;
        } else {
             lastData = dataKBytes;
         }
    }
    return data;
}


采用了这个方法:

CGFloat    scaleFloat = 0.6;

+ (UIImage *) scaleImage: (UIImage *)image scaleFactor:(float)scaleFloat

{

    CGSize size = CGSizeMake(image.size.width * scaleBy, image.size.height * scaleBy);


    UIGraphicsBeginImageContext(size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGAffineTransform transform = CGAffineTransformIdentity;


    transform = CGAffineTransformScale(transform, scaleBy, scaleBy);

    CGContextConcatCTM(context, transform);


    // Draw the image into the transformed context and return the image

    [image drawAtPoint:CGPointMake(0.0f, 0.0f)];

    UIImage *newimg = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();


    return newimg;  

}


0 0