裁剪图像时的角度性能问题

Posted

技术标签:

【中文标题】裁剪图像时的角度性能问题【英文标题】:Angular performance issues when cropping image 【发布时间】:2020-06-15 00:15:02 【问题描述】:

我正在使用 this component 来裁剪图像,作为 ionic/angular8 项目的一部分,但我遇到了严重的性能问题,导致应用程序有时反应迟钝,这仅在从移动设备、桌面版本运行时表现出来没有显示任何问题,裁剪效果很好。

在某些情况下进行性能评估时,我会看到这些垃圾回收;我来自java世界,GC总是一个性能问题,但没有找到太多关于它的东西,但我认为它不是问题的根源:

这是另一个示例,似乎是用户与屏幕交互与调用我的内部方法之间的延迟,您可以看到有一个 FunctionCall,但是是哪个函数。

我的通用代码与网站中的几乎相同,但我会在这里分享:

html

<div class="popup-form-container ion-text-center ion-padding">
<image-cropper
      [imageChangedEvent]="imageChangedEvent"
      [maintainAspectRatio]="true"
      [aspectRatio]="4 / 4"
      format="png"
      (imageCropped)="imageCropped($event)"
      (imageLoaded)="imageLoaded()"
      (cropperReady)="cropperReady()"
      (loadImageFailed)="loadImageFailed()"
  ></image-cropper>
  <ion-button fill="clear" color="danger" (click)="close()">Cancelar</ion-button>
  <ion-button color="green" (click)="save()">Guardar</ion-button>
</div>

在这里你可以看到我的课程,我在查找问题的过程中添加了一堆控制台日志,我看到的是当应用程序冻结并停留在长调用中时,没有输出,然后从souden出来,连续很多:

    @Component(
  selector: 'app-crop-image-popover',
  templateUrl: './crop-image-popover.component.html',
  styleUrls: ['./crop-image-popover.component.scss',
              '../../text-area/text-edit-popover/text-edit-popover.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
)
export class CropImagePopoverComponent implements OnInit 

  @Input()
  imageChangedEvent: any;

  private croppedImage: any = '';
  private uploader: FileUploader;
  private imageUrl: any;
  private errors: any;

  constructor(private modalCtrl: ModalController,
              private commonSrv: CommonService,
              protected cloudinary: Cloudinary,
              private alertCtrl: AlertController,
              private sysParamsSrv: SystemParamsService,
              private base64: Base64,
              private domSanitizer: DomSanitizer,
              private imageCompress: NgxImageCompressService,
              private changeDetector: ChangeDetectorRef) 
    // Inicializamos el compoente de carga de archivos

  

  ngOnInit() 

  imageCropped(event: ImageCroppedEvent) 
    console.log('cropped');
    this.croppedImage = event.base64;
  
  imageLoaded() 
    console.log('loaded');
    // show cropper
//     this.commonSrv.hideSpinner();
  
  cropperReady() 
    // cropper ready
    console.log('ready');
    this.commonSrv.hideSpinner();
  
  loadImageFailed() 
    // show message
    console.log('failed');
  

  close() 
    this.modalCtrl.dismiss();
  

我已经尝试过更新 changeDetection 策略,删除了我在其他页面中的一些函数调用,以及大部分性能建议,但我似乎没有找到我当前问题的原因

【问题讨论】:

你调试的怎么样了?在什么设备/什么平台上? 嗨@AluanHaddad,我在摩托罗拉 g6 和 g7 上运行具有相同的行为,我使用 chrome 工具和 ADB 进行调试,在浏览器上运行时我没有看到延迟 我也有同样的问题,加载小图会很流畅,但是加载高分辨率图片时手机浏览器会卡住。 【参考方案1】:

ngx-image-cropper,当您更改裁剪大小/位置时,它实际上会裁剪图像并且非常耗费资源。如果你能侥幸成功,你只能通过将autoCrop 设置为 false 来进行一次裁剪,如下所示:

<image-cropper
    [imageChangedEvent]="imageChangedEvent"
    [maintainAspectRatio]="true"
    [aspectRatio]="1"
    [autoCrop]="false"
    format="png"
    (imageLoaded)="imageLoaded()"
    (cropperReady)="cropperReady()"
    (loadImageFailed)="loadImageFailed()"
></image-cropper>
<ion-button fill="clear" color="danger" (click)="close()">Cancelar</ion-button>
<ion-button color="green" (click)="save()">Guardar</ion-button>

然后使用@ViewChild 访问裁剪器和裁剪方法。这是打字稿文件中的内容:

@ViewChild(ImageCropperComponent) imageCropper: ImageCropperComponent;

然后,当用户选择保留裁剪时,您需要执行以下操作:

function save(): void 
  const event = this.imageCropper.crop();
  this.croppedImage = event.base64;

这将解决一些性能问题。但请注意,iDevices 似乎很难以ngx-image-cropper 的方式处理裁剪。具体来说,如果用户在上传图像时使用相机,图像可能需要太多内存才能在 Safari 线程中转换为 base64 字符串 - 因此,iDevices 在正常使用时可能会冻结。这是一个讨论这个问题的地方:https://github.com/Mawi137/ngx-image-cropper/issues/481

【讨论】:

以上是关于裁剪图像时的角度性能问题的主要内容,如果未能解决你的问题,请参考以下文章

加载缓慢时的 ALAsset 照片库图像性能改进

使用 PyQt 根据角度裁剪图像

裁剪给定角度的图像

使用 UIImagePickerController Swift 时的圆形图像裁剪

调整 UIImage 大小 - 性能问题

在 Swift 中使用 NSRectFill 推送像素时的性能问题