您的位置:澳门新葡萄京娱乐网站 > 编程知识 > iOS显示十分的大图片或超高分辨率图片崩溃排除

iOS显示十分的大图片或超高分辨率图片崩溃排除

2019-12-22 01:31

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

前言:

ID作为一款以IM为基础的办公软件,在用户使用过程中,经常会遇到一些超大的或者超高分辨率的图片(以下统一称:大图)。基于SDWebImage为基础的图片加载控件,在遇到此情况时,并没有提供十分有效的解决方法(如果你谷歌或者百度,有很多回答,但实际并未能解决此问题)。曾经一度困扰许久。现在将我的解决方式写下来,希望可以对你有所帮助。

imagepng; --> Size = 225Kimagepng; --> Size = 85.9Kimagepng; --> Size = 83.7Kimagepng; --> Size = 80.9Kimagepng; --> Size = 74.6Kimagepng; --> Size = 73.8Kimagepng; --> Size = 73Kimagepng; --> Size = 72.4Kimagepng; --> Size = 71Kimagepng; --> Size = 70.6K

src = $src; } /** 打开图片 */ public function openImage(){ list($width, $height, $type, $attr) = getimagesize; $this->imageinfo = array( 'width'=>$width, 'height'=>$height, 'type'=>image_type_to_extension, 'attr'=>$attr ); $fun = "imagecreatefrom".$this->imageinfo['type']; $this->image = $fun; } /** 操作图片 */ public function thumpImage(){ $new_width = $this->imageinfo['width'] * $this->percent; $new_height = $this->imageinfo['height'] * $this->percent; $image_thump = imagecreatetruecolor($new_width,$new_height); //将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度 imagecopyresampled($image_thump,$this->image,0,0,0,0,$new_width,$new_height,$this->imageinfo['width'],$this->imageinfo['height']); imagedestroy; $this->image = $image_thump; } /** 输出图片 */ public function showImage(){ header('Content-Type: image/'.$this->imageinfo['type']); $funcs = "image".$this->imageinfo['type']; $funcs; } /** 保存图片到硬盘 */ public function saveImage{ $funcs = "image".$this->imageinfo['type']; $funcs($this->image,$name.'.'.$this->imageinfo['type']); } /** 销毁图片 */ public function __destruct(){ imagedestroy; } } ?>

percent = 0.2; $image->openImage(); $image->thumpImage(); $image->showImage(); $image->saveImage; ?>

结语:

此解决方式在实现上非常简单,开始只是困于思路。如果你有其他的方式,那我们就开始一段愉快的交流吧!

本文实例分析了php中10个不同等级压缩优化图片操作。分享给大家供大家参考,具体如下:

图片压缩是我们日常开发中经常使用的操作,在如今需求很多的情况往往,上传的一张图片会被压缩成不同比例的图片,每次去操作也是一件非常繁琐的事情,于是进行了封装了一个压缩图片的操作类,希望大家遇到后,不用再为写很多压缩图片代码烦恼了。

参考:

作为IM软件的领军,QQ与微信无疑给IM行业树立了一个很好的榜样。那我们就来看看它们是如何处理的(以下简单描述,自己可以实际体验):

QQ:
点击大图浏览时,会有一个转圈等待操作,对图片放大的大小无限制。在放大过程中,图片会模糊,停止操作后,一张清晰的高清图渲染出来。如果图片过大并分辨率超高(上万),会出现崩溃。

微信:
点击大图浏览时,直接展示。但是对图片展示大小有限制。放大到一定程度,无法继续放大查看。

做为办公软件,无需解释,很明显QQ的方式更符合需求。

老外的解释有没有道理呢?他认为原始图片其实是经过了轻微的压缩,而0等级的压缩就是一点压缩都没有,所以它的体积会大于原始图片。我感觉此话不无道理。

压缩图片的工具类:

实现:

对于大图,压缩肯定使我们需要的,QQ转圈等待同样我猜测也是压缩操作。

压缩:
压缩图片我们希望可以保证压缩的速度够快及内存消耗的尽可能小。在此感谢github上的OTLargeImageReader的作者,压缩过程中内存控制和速度都很好。

关键代码:

//先从内存中查找,查找不到再解码,避免重复解码
UIImage *cacheImage = [self.photoBrowser cacheImageWithPhoto:_photo];
if (cacheImage == nil) {
    //不存在,解码
    [self.photoBrowser showHUDWithSuperBigPhoto];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        CGSize compressSize = CGSizeMake(XXPhotoCompressPixelMax, XXPhotoCompressPixelMax);
        if (image.size.width > image.size.height) {
            compressSize = CGSizeMake(XXPhotoCompressPixelMax, XXPhotoCompressPixelMax*image.size.height/image.size.width);
        }
        else {
            compressSize = CGSizeMake(XXPhotoCompressPixelMax*image.size.width/image.size.height, XXPhotoCompressPixelMax);
        }
        UIImage *compressedImage = [image imageByScalingProportionallyToSize:compressSize];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.photoBrowser cacheImageWithPhoto:_photo image:compressedImage];
            self.showImageView.image = compressedImage;
            [self.photoBrowser hideHUDWithSuperBigPhoto];
            [self resetSize];
        });
    });
}
else {
    //直接使用
    self.showImageView.image = cacheImage;
}

通过以上方式,加上参考QQ的交互方式,此时,一张分辨率有限的大图在经过短暂压缩处理后,已经可以非常安全的在app中展示浏览了(缓存压缩图片避免重复压缩)。但是,压缩过的图片放大后,模糊不清了!这不能忍,继续搞。
当在QQ中浏览图片进行放大时,可以很轻易的发现,此时的图片也是模糊的(这就印证了转圈过程中对图片的压缩操作),然而当我们停止放大操作后,当前展示的模糊图被重新渲染展示给我们,清晰,完美!
此时,如果你遇到过这个问题,并且尝试过解决,你肯定找到了苹果官方提供的Demo以及一些分块加载的方式。这个成本太高,不建议。
思来想去,一个新的方式出现了:用户在这个大图中,关注的只有当前屏幕中展示的这一区域的图片,当用户不操作图片时,拿到图片在手机屏幕上的元素覆盖展示出来。用户操作时,移除覆盖图层,停止后重新操作。

裁剪图片:
裁剪当前屏幕中展示对应原图中的位置

- (void)didCutImage {
    if (_orImage) {
        if (self.scrollView.contentSize.width >= kScreenWidth &&
            self.scrollView.contentSize.height >= kScreenHeight) {
            CGFloat multipleF = _orImage.size.width/self.scrollView.contentSize.width;
            CGFloat width = kScreenWidth*multipleF;
            CGFloat height = kScreenHeight *multipleF;
            //如果剪切的尺寸过大,不处理
            if (width > XXPhotoPixelMax ||
                height > XXPhotoPixelMax) {
                return;
            }
            //如果剪切的尺寸过大,不处理
            //裁剪展示视图
            if (_bigCupImageView) {
                _bigCupImageView.frame = CGRectMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y, kScreenWidth, kScreenHeight);
            }
            else {
                [self.scrollView addSubview:self.bigCupImageView];
            }
            //裁剪展示视图
            CGImageRef cgRef = _orImage.CGImage;
            CGImageRef imageRef = CGImageCreateWithImageInRect(cgRef, CGRectMake(self.scrollView.contentOffset.x *multipleF   ,self.scrollView.contentOffset.y *multipleF, width, height));
            UIImage *thumbScale = [UIImage imageWithCGImage:imageRef];
            CGImageRelease(imageRef);
            self.bigCupImageView.image = thumbScale;
        }
    }
}

在这个过程中,仍需要注意的是,何时展示与隐藏剪切出来的图片。
覆盖图片的添加与移除:
添加:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(didCutImage) withObject:nil afterDelay:.5];
}

移除:

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view {
    if (_bigCupImageView) {
        [_bigCupImageView removeFromSuperview];
        _bigCupImageView = nil;
    }
}

我不明白的是为什么压缩等级为0时,它的体积反而变大了?

原图体积是125k,现在我想看看在不同的等级压缩下会得到什么样的结果。如下为测试记录。

希望本文所述对大家PHP程序设计有所帮助。

我们在优化的时候,一般采用2等级比较合适,图片没有失真,但体积减少了30%,达到优化的目的了。如果采用6、7、8、9等级压缩的话,图片有所失真,所以不宜采用这些等级进行压缩优化图片。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《php文件操作总结》、《PHP数组操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《php字符串用法总结》、《php mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

今天找到一个php写的压缩图片程序,可以分10个等级来压缩,0等级时压缩比率不是很大,图片不会失真;随着压缩等级不断增大,图片会变得越来越不清晰,通常压缩后图片大小可以减少到原来的50%,压缩比还是挺大的。

如下是php压缩图片程序

quality Compression level: from 0 to 9.

It's normal for the 0ed file to be larger than the original (that can be slightly compressed to begin with). You need to understand file compression and PHP GD image constructor.

The result seems accurate since 0 means no compression

我们看看老外是怎么解释这个现象的:

本文由澳门新葡萄京娱乐网站发布于编程知识,转载请注明出处:iOS显示十分的大图片或超高分辨率图片崩溃排除

关键词: