iOS 压缩与裁剪图片问题

时间:2023-03-08 17:12:26
iOS 压缩与裁剪图片问题

我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好。

这时你可能想到设置UIImageView的属性 _imageView.contentMode = UIViewContentModeCenter;  设置该属性后,我们会发现图片的宽高比例确实正确了,但是窗口中只显示了图片的一部分,这说明图片整体尺寸没有压缩,按照原图进行显示了。怎样才能达到既缩小图片又不改变原来的宽高比例呢?

方法一:将图片按照原来的宽高比例压缩到与窗口合适的大小,然后在设置了_imageView.contentMode = UIViewContentModeCenter;  这个属性的UIImageView中展示压缩后的图片。

//压缩图片

  1. - (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize
  2. {
  3. // Create a graphics image context
  4. UIGraphicsBeginImageContext(newSize);
  5. // Tell the old image to draw in this new context, with the desired
  6. // new size
  7. [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
  8. // Get the new image from the context
  9. UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
  10. // End the context
  11. UIGraphicsEndImageContext();
  12. // Return the new image.
  13. return newImage;
  14. }

上面方法的参数newSize是和图片显示窗口差不多大的,结果出现了原图清晰,但压缩后图片不清晰的情况。

方法二:按照窗口宽高比例,将原图横向或者纵向裁剪掉多余的部分,然后不设置UIImageView的contentMode属性,将裁剪后的图片送进去,使其自动适应窗口

  1. //裁剪图片
  2. - (UIImage *)cutImage:(UIImage*)image
  3. {
  4. //压缩图片
  5. CGSize newSize;
  6. CGImageRef imageRef = nil;
  7. if ((image.size.width / image.size.height) < (_headerView.bgImgView.size.width / _headerView.bgImgView.size.height)) {
  8. newSize.width = image.size.width;
  9. newSize.height = image.size.width * _headerView.bgImgView.size.height / _headerView.bgImgView.size.width;
  10. imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0, fabs(image.size.height - newSize.height) / 2, newSize.width, newSize.height));
  11. } else {
  12. newSize.height = image.size.height;
  13. newSize.width = image.size.height * _headerView.bgImgView.size.width / _headerView.bgImgView.size.height;
  14. imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(fabs(image.size.width - newSize.width) / 2, 0, newSize.width, newSize.height));
  15. }
  16. return [UIImage imageWithCGImage:imageRef];
  17. }

结果表明方法二效果更好。