javascript - Hur laddar man bilden på ngx-image-cropper utan att anropa imageChangedEvent-händelsen?


Jag utvecklade en beskärningsfunktion baserad på ngx-image-cropper som tillåter att beskära/rotera vissa bilder. För demon av sprinten vill jag att bilderna ska visas när applikationen startar, så jag behöver initiera bilderna på ngx-image-cropper utan att kalla på fileChangeEvent()-händelsen.

Detta är det faktiska resultatet, det fungerar bra.

Jag klickar på en av länkarna (Foto - Signatur - ...) och filuppladdaren öppnas för att välja ett foto att beskära.

Det här är vad jag vill:

när du öppnar sidan i början, ladda en fil från min disk utan att klicka på länken.

Ps: Jag använder Angular 8

Och här är koden för beskäraren:

       <mat-card-content style="padding:3% 5%; text-align: center; ">
          <image-cropper [ngClass]=" loaded && showCropper && !cropped ? 'showCropper' : 'hideCropper' "
            [imageChangedEvent]="imageChangedEvent"
            [maintainAspectRatio]="false"
            [containWithinAspectRatio]="containWithinAspectRatio"
            [aspectRatio]="5 / 3"
            [cropperMinWidth]="128"
            [onlyScaleDown]="true"
            [roundCropper]="false"
            [canvasRotation]="canvasRotation"
            [transform]="transform"
            [alignImage]="'center'"
            [style.display]="showCropper ? null : 'none'"
            format="png"
            (imageCropped)="imageCropped($event)"
            (imageLoaded)="imageLoaded()"
            (cropperReady)="cropperReady($event)"
            (loadImageFailed)="loadImageFailed()"
          >
          </image-cropper>
          <img
            *ngIf="loaded && !showCropper && cropped"
            class="document-photo"
            [src]="croppedImage"
          />
          <div *ngIf="!loaded" class="divNone"></div>
          <div class="icon-image">
            <mat-icon (click)="rotateLeft()">rotate_left</mat-icon>
            <mat-icon (click)="rotateRight()">rotate_right</mat-icon>
            <mat-icon (click)="activateCrop()">crop</mat-icon>
            <mat-icon (click)="clearImage()">clear</mat-icon>
            <mat-icon (click)="validate()">check</mat-icon>
            <mat-icon>note_add</mat-icon>
          </div>
        </mat-card-content>
        <mat-list-item class="item-doc text-blue-in">
              <mat-icon class="icon-info" matTooltipPosition="above" matTooltip="Info about the photo">info</mat-icon>
              <mat-icon *ngIf="!photo" class="text-grey-in">check_box_outline_blank</mat-icon>
              <mat-icon *ngIf="photo" class="text-grey-in">check_box</mat-icon>
              <input style="visibility: hidden; display: none;" #linkPhoto type="file" (change)="fileChangeEvent($event, 'photo')"/>
              <mat-label class="doc-title text-grey-in" (click)="onLoadPhoto()" >Photo</mat-label>
              <mat-icon *ngIf="photoSent" class="icon-edit" (click)="editPhoto()">edit</mat-icon                  >
        </mat-list-item>

Så frågan är: Hur laddar man en bild från disken i ngx-image-cropper utan att anropa fileChangedEvent?

Svar #1

1) om du vill, istället för att välja en bild med Uppladdaren/öppna fönster (från filinmatning) och ladda bilden från projektkatalogen (t.ex. med assets/images) eller mata in den som en sträng (base64) måste du lägga till en inmatning:

[imageBase64] = "imageBase64String"

där imageBase64String inte är (../../assets/image.jpg)

men värdet av base64 (date:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQA.....)

2) Författaren skriver att:

"Alla inmatningar är valfria. Antingen imageChangedEvent, imageBase64 eller imageFile bör anges för att ladda en bild i beskäraren."

Och

Ange imageBase64 (sträng):

"Om du inte vill använda en filinmatning kan du ange en base64-bild direkt och den kommer att laddas in i beskäraren"

3) För att inte ha ett fel i konsolen:

"ERROR Error: Uncaught (in promise): Event: {" isTrusted ": true}"

Det bästa tillägget är ngIf (allt kan se ut så här):

<image-cropper
  *ngIf="imageBase64String"
  [imageChangedEvent]="imageChangedEvent"
  [imageBase64]="imageBase64String"
  ...
  ></image-cropper>

4) Och hur lägger man till base64?

Du kan skapa en funktion t.ex. getBase64FromFile(img) {...} och göra det med XMLHttpRequest() + FileReader() och tilldela resultatet till this.imageBase64String=(base64 as any).result

när ngx-image-cropper laddas, t.ex.

ngAfterViewInit (): void {
  this.getBase64FromFile('../../assets/image.jpg');
}

Se, det är intressant här http://www.programmersought.com/article/52582038406/

Relaterade artiklar