【问题标题】:IOS/Objective-C: Reduce file size of pngs for thumbnailsIOS/Objective-C:为缩略图减少 png 的文件大小
【发布时间】:2015-12-12 01:51:19
【问题描述】:

我允许用户拍摄个人资料照片,然后我需要将其上传到服务器。 iPhone 图片的文件大小很大......比个人资料图片所需的大得多,它们占用了手机上的大量空间,并且需要很长时间才能上传到服务器。我发现有时如果互联网连接较弱,服务器会在上传中途超时。

我在一个类别中有代码来减小图像大小的高度和宽度,但它似乎并没有减小实际文件大小。

任何人都可以提出一种简单的方法来做到这一点 - 理想情况下不使用繁重的库。另外,我想避免转换为我知道允许有损压缩的 jpg。

谢谢。

编辑:

问题也可能在于我在下面创建缩略图后如何使用它,因此我也包含了该代码。

这是我用来减少高度和宽度的代码,但它似乎并没有减少大小(以字节为单位)。

@implementation UIImage (Thumbnail)
-(UIImage *) createThumbnailToFillSize:(CGSize)size
{
    CGSize mainImageSize = size;
    UIImage *thumb;

    CGFloat widthScaler = size.width / mainImageSize.width;
    CGFloat heightScaler = size.height / mainImageSize.height;

    CGSize repositionedMainImageSize = mainImageSize;

    CGFloat scaleFactor;
    // Determine if we should shrink based on width or hight
    if(widthScaler > heightScaler)
    {
        // calculate based on width scaler
        scaleFactor = widthScaler;
        repositionedMainImageSize.height = ceil(size.height / scaleFactor);
    }
    else {
        // calculate based on height scaler
        scaleFactor = heightScaler;
        repositionedMainImageSize.width = ceil(size.width / heightScaler);
    }

    UIGraphicsBeginImageContext(size);

    CGFloat xInc = ((repositionedMainImageSize.width-mainImageSize.width) / 2.f) *scaleFactor;
    CGFloat yInc = ((repositionedMainImageSize.height-mainImageSize.height) / 2.f) *scaleFactor;

    [self drawInRect:CGRectMake(xInc, yInc, mainImageSize.width * scaleFactor, mainImageSize.height * scaleFactor)];
    thumb = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    return thumb;
}



   //Display image in viewdidload by calling above method:

      UIImage *chosenImage = [self loadImageNamed:picname];
            CGFloat side = 150;
            side *=[[UIScreen mainScreen] scale];
            UIImage *thumbnail = [chosenImage createThumbnailToFillSize:CGSizeMake(side, side)];
            self.imageView.image = thumbnail;


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.didChange=YES;
      self.imageWasPicked = YES;//this is a dupe but used for updateButton
    self.changedPic=YES;
    [self updateSaveButton];

    self.imageView.image = chosenImage;
//Should I be putting code to make thumbnail here instead of in display?

    [picker dismissViewControllerAnimated:YES completion:NULL];

}

【问题讨论】:

  • 您是否真的检查过生成图像的大小(以像素和字节为单位,一旦转换为您想要的任何格式)?另外你要转换成什么格式? JPEG 是有损的,但质量系数不错,您不会注意到它。

标签: ios objective-c image


【解决方案1】:

如果您使用 UIImagePickerController 来让用户选择图片,请确保您设置了

theImagePickerController.allowsEditing = YES;

这应该已经将最终图像的大小减小了 10-15 倍。

如果接收到的图片还是太大,那么here你可以找到一些很好的调整图片大小的例子。

【讨论】:

  • 一个问题。是否可以将 .allowsediting 设置为 YES 并跳过询问您“使用照片”的步骤?
  • 你的意思是屏幕上有两个按钮——“取消”和“选择照片”吗?我不认为这是可能的。屏幕供用户选择图像的适当部分(正方形?)。
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2010-11-26
  • 2016-08-28
  • 2011-10-23
相关资源
最近更新 更多