angular 中的图像灰度变化(滑块)
Image change greyscale (Slider) in angular
我正在尝试使用滑块控件将图像更改为灰度和棕褐色
这是我的 html 代码
<div class="card-body">
<input id="sepia" type="range" oninput="set(this, 'sepia');" value="0" step="0.1" min="0" max="1"> Sepia <span id="Amount_sepia">(0)</span><br/>
<input id="grayscale" type="range" oninput="set(this, 'grayscale');" value="0" step="0.1" min="0" max="1"> Grayscale <span id="Amount_grayscale">(0)</span><br/>
</div>
<img class="img-fluid" id="img_prev" src="{{actualImage}}" *ngIf="!this.showCropper" />
<image-cropper id="img_prev" class="imageclass" *ngIf="this.showCropper"
[autoCrop]="false"
[imageChangedEvent]="imageChangedEvent"
[maintainAspectRatio]="true"
[aspectRatio]="4 / 3"
[resizeToWidth]="256"
[cropperMinWidth]="128"
[onlyScaleDown]="true"
format="png"
(imageCropped)="imageCropped($event)"
(imageLoaded)="imageLoaded()"
(cropperReady)="cropperReady()"
(loadImageFailed)="loadImageFailed()" style="max-height:500px">
</image-cropper>
这是我的 ts
public set(e,f){
document.getElementById('img_prev').style["filter"] = f+"("+e.value+")";
document.getElementById('Amount_'+f).innerHTML="("+e.value+")";
}
我遇到错误
(index):13 Uncaught ReferenceError: set is not defined
at HTMLInputElement.oninput ((index):13)
为什么不使用“Angular 方式”?
你声明了两个变量
sepia=0;
grayScale=0;
并且只需使用 [(ngModel)]
和 [style.filter]
<input id="sepia" type="range" [(ngModel)]="sepia"
step="0.1" min="0" max="1"> Sepia
<span id="Amount_sepia">({{sepia}})</span>
<br/>
<input id="grayscale" type="range" [(ngModel)]="grayScale"
step="0.1" min="0" max="1"> Grayscale
<span id="Amount_grayscale">({{grayScale}})</span>
<br/>
<img [style.filter]="'grayscale('+grayScale+') sepia('+sepia+')'"
src="https://picsum.photos/300/300?random=1">
在上面的示例中,使用了 oninput
属性,即 global event attribute。这通常与 vanilla js 一起使用,但在 Angular 中还有另一种在 TypeScript 代码中调用函数的方法:事件绑定。
在 Angular 中不使用全局事件属性,我们使用 Angular.
的事件绑定功能来代替它们绑定到 DOM Event
后面oninput="set(this, 'sepia');"
应该改成(input)="set(..params..)"
的格式。
但是,似乎有必要进行一些调整。例如,输入绑定中的 this
作为参数将不起作用,很可能 $event
将包含必要的信息。另一方面,不建议使用 document.getElementById
访问本机 DOM 元素,我建议使用 ViewChild 代替它。
我正在尝试使用滑块控件将图像更改为灰度和棕褐色
这是我的 html 代码
<div class="card-body">
<input id="sepia" type="range" oninput="set(this, 'sepia');" value="0" step="0.1" min="0" max="1"> Sepia <span id="Amount_sepia">(0)</span><br/>
<input id="grayscale" type="range" oninput="set(this, 'grayscale');" value="0" step="0.1" min="0" max="1"> Grayscale <span id="Amount_grayscale">(0)</span><br/>
</div>
<img class="img-fluid" id="img_prev" src="{{actualImage}}" *ngIf="!this.showCropper" />
<image-cropper id="img_prev" class="imageclass" *ngIf="this.showCropper"
[autoCrop]="false"
[imageChangedEvent]="imageChangedEvent"
[maintainAspectRatio]="true"
[aspectRatio]="4 / 3"
[resizeToWidth]="256"
[cropperMinWidth]="128"
[onlyScaleDown]="true"
format="png"
(imageCropped)="imageCropped($event)"
(imageLoaded)="imageLoaded()"
(cropperReady)="cropperReady()"
(loadImageFailed)="loadImageFailed()" style="max-height:500px">
</image-cropper>
这是我的 ts
public set(e,f){
document.getElementById('img_prev').style["filter"] = f+"("+e.value+")";
document.getElementById('Amount_'+f).innerHTML="("+e.value+")";
}
我遇到错误
(index):13 Uncaught ReferenceError: set is not defined
at HTMLInputElement.oninput ((index):13)
为什么不使用“Angular 方式”?
你声明了两个变量
sepia=0;
grayScale=0;
并且只需使用 [(ngModel)]
和 [style.filter]
<input id="sepia" type="range" [(ngModel)]="sepia"
step="0.1" min="0" max="1"> Sepia
<span id="Amount_sepia">({{sepia}})</span>
<br/>
<input id="grayscale" type="range" [(ngModel)]="grayScale"
step="0.1" min="0" max="1"> Grayscale
<span id="Amount_grayscale">({{grayScale}})</span>
<br/>
<img [style.filter]="'grayscale('+grayScale+') sepia('+sepia+')'"
src="https://picsum.photos/300/300?random=1">
在上面的示例中,使用了 oninput
属性,即 global event attribute。这通常与 vanilla js 一起使用,但在 Angular 中还有另一种在 TypeScript 代码中调用函数的方法:事件绑定。
在 Angular 中不使用全局事件属性,我们使用 Angular.
的事件绑定功能来代替它们绑定到 DOM Event后面oninput="set(this, 'sepia');"
应该改成(input)="set(..params..)"
的格式。
但是,似乎有必要进行一些调整。例如,输入绑定中的 this
作为参数将不起作用,很可能 $event
将包含必要的信息。另一方面,不建议使用 document.getElementById
访问本机 DOM 元素,我建议使用 ViewChild 代替它。