使用 CamanJS 进行图像处理
Image manipulation using CamanJS
我找到了一个名为 CamanJS 的图像处理库,这些示例看起来不错,所以我尝试使用它。我得到以下 html:
<ion-view class="menu-content" view-title="Filter">
<ion-content overflow-scroll="true">
<div id="polaroid-filter-img" class="polaroid-filter-img">
<img id="polaroid-filter-img-img" ng-src="{{polaroid.cropped}}" />
</div>
<div class="polaroid-filter-examples">
<div ng-repeat="filter in filters" ng-click="performFilter(filter.id)" id="filter.id">
<img id="{{filter.id}}" ng-src="{{filter.image}}"/>
<span>{{filter.name}}</span>
</div>
</div>
</ion-content>
</ion-view>
这个css:
.polaroid-filter-img {
display: block;
position: relative;
margin-left: auto;
margin-right: auto;
top: 10%;
}
.polaroid-filter-img img {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
@media only screen and (orientation: portrait) {
.polaroid-filter-examples {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
overflow: auto;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
}
.polaroid-filter-examples div {
display: inline-block;
}
}
@media only screen and (orientation: landscape) {
.polaroid-filter-examples {
position: fixed;
top: 0;
right: 0;
height: 100%;
overflow: auto;
overflow-x: hidden;
overflow-y: scroll;
white-space: nowrap;
}
.polaroid-filter-examples div {
display: block;
}
}
.polaroid-filter-examples div {
font-size: 14px;
text-align: center;
color: white;
}
.polaroid-filter-examples img {
margin: 0 auto;
padding: 2px 2px 2px 2px;
width: 125px;
height: 125px;
}
.polaroid-filter-examples span {
display: block;
padding-bottom: 10px;
padding-top: 10px;
}
还有这个JavaScript:
angular.module("App.Polaroids-Edit-Filter")
.controller("PolaroidsEditFilterController", function ($scope, $stateParams, PolaroidsService, FiltersService) {
$scope.polaroid = PolaroidsService.getPolaroid($stateParams.id, $stateParams.size);
$scope.filters = FiltersService.getFilters();
var previousFilter = null;
$scope.performFilter = function (id) {
if (id != null && id != previousFilter) {
if (previousFilter != null) {
document.getElementById(previousFilter).style.border = "none";
}
document.getElementById(id).style.border = "solid #FF0000";
if (id == "normal") {
var image = document.getElementById("polaroid-filter-img-img");
img.src = $scope.polaroid.cropped;
} else {
var image = document.getElementById("polaroid-filter-img-img");
Caman(image, function () {
if (id == "vintage") {
this.vintage();
}
this.render(function () {
console.log("filtering finished");
});
});
}
previousFilter = id;
}
};
function initView() {
var width = screen.width * 0.7;
var height = width;
var initialId = $scope.filters[0].id;
previousFilter = initialId;
document.getElementById("polaroid-filter-img").style.width = width + "px";
document.getElementById("polaroid-filter-img").style.height = height + "px";
document.getElementById(initialId).style.border = "solid #FF0000";
}
var intervalId = setInterval(function () {
initView();
window.clearInterval(intervalId);
}, 100);
});
当我启动我的应用程序并选择一张图片时,我得到以下信息:
当我现在单击复古过滤器时,会发生以下情况:
如您所见,图片已调整为实际宽度和高度,之后
大约 20 秒:
过滤器被应用。所以有两种我不明白的奇怪行为。
- 第一:为什么图片会变大?
- 第二:为什么应用过滤器需要这么长时间(20 秒)?我找到了一个他们使用 CamanJS 的演示,在该演示中,过滤几乎是立即执行的:Instagram Filters
你能帮我了解那里出了什么问题吗?
编辑
如果我使用 canvas 来实现 here,那么 canvas 在应用过滤器时就会消失。
我检查了您的代码,发现 css 有 1 个小问题。在您的 class .polaroid-filter-img img
中,有 position: absolute;
。这应该是 position: relative;
。例如:
.polaroid-filter-img img {
position: relative;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
我认为另一个问题是您的 javascript 函数 initView
。在此函数中,您的以下值出错 height
和 width
:
var width = screen.width * 0.7;
var height = width;
var initialId = $scope.filters[0].id;
请检查控制台日志
中的height
和width
如果它仍然可以帮助您解决问题,请查看另一篇文章
那里的解决方案与 Ionic+AngularJS+Phonegap 配合得很好,没有奇怪的调整大小。
HTH.
我找到了一个名为 CamanJS 的图像处理库,这些示例看起来不错,所以我尝试使用它。我得到以下 html:
<ion-view class="menu-content" view-title="Filter">
<ion-content overflow-scroll="true">
<div id="polaroid-filter-img" class="polaroid-filter-img">
<img id="polaroid-filter-img-img" ng-src="{{polaroid.cropped}}" />
</div>
<div class="polaroid-filter-examples">
<div ng-repeat="filter in filters" ng-click="performFilter(filter.id)" id="filter.id">
<img id="{{filter.id}}" ng-src="{{filter.image}}"/>
<span>{{filter.name}}</span>
</div>
</div>
</ion-content>
</ion-view>
这个css:
.polaroid-filter-img {
display: block;
position: relative;
margin-left: auto;
margin-right: auto;
top: 10%;
}
.polaroid-filter-img img {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
@media only screen and (orientation: portrait) {
.polaroid-filter-examples {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
overflow: auto;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
}
.polaroid-filter-examples div {
display: inline-block;
}
}
@media only screen and (orientation: landscape) {
.polaroid-filter-examples {
position: fixed;
top: 0;
right: 0;
height: 100%;
overflow: auto;
overflow-x: hidden;
overflow-y: scroll;
white-space: nowrap;
}
.polaroid-filter-examples div {
display: block;
}
}
.polaroid-filter-examples div {
font-size: 14px;
text-align: center;
color: white;
}
.polaroid-filter-examples img {
margin: 0 auto;
padding: 2px 2px 2px 2px;
width: 125px;
height: 125px;
}
.polaroid-filter-examples span {
display: block;
padding-bottom: 10px;
padding-top: 10px;
}
还有这个JavaScript:
angular.module("App.Polaroids-Edit-Filter")
.controller("PolaroidsEditFilterController", function ($scope, $stateParams, PolaroidsService, FiltersService) {
$scope.polaroid = PolaroidsService.getPolaroid($stateParams.id, $stateParams.size);
$scope.filters = FiltersService.getFilters();
var previousFilter = null;
$scope.performFilter = function (id) {
if (id != null && id != previousFilter) {
if (previousFilter != null) {
document.getElementById(previousFilter).style.border = "none";
}
document.getElementById(id).style.border = "solid #FF0000";
if (id == "normal") {
var image = document.getElementById("polaroid-filter-img-img");
img.src = $scope.polaroid.cropped;
} else {
var image = document.getElementById("polaroid-filter-img-img");
Caman(image, function () {
if (id == "vintage") {
this.vintage();
}
this.render(function () {
console.log("filtering finished");
});
});
}
previousFilter = id;
}
};
function initView() {
var width = screen.width * 0.7;
var height = width;
var initialId = $scope.filters[0].id;
previousFilter = initialId;
document.getElementById("polaroid-filter-img").style.width = width + "px";
document.getElementById("polaroid-filter-img").style.height = height + "px";
document.getElementById(initialId).style.border = "solid #FF0000";
}
var intervalId = setInterval(function () {
initView();
window.clearInterval(intervalId);
}, 100);
});
当我启动我的应用程序并选择一张图片时,我得到以下信息:
当我现在单击复古过滤器时,会发生以下情况:
如您所见,图片已调整为实际宽度和高度,之后 大约 20 秒:
过滤器被应用。所以有两种我不明白的奇怪行为。
- 第一:为什么图片会变大?
- 第二:为什么应用过滤器需要这么长时间(20 秒)?我找到了一个他们使用 CamanJS 的演示,在该演示中,过滤几乎是立即执行的:Instagram Filters
你能帮我了解那里出了什么问题吗?
编辑
如果我使用 canvas 来实现 here,那么 canvas 在应用过滤器时就会消失。
我检查了您的代码,发现 css 有 1 个小问题。在您的 class .polaroid-filter-img img
中,有 position: absolute;
。这应该是 position: relative;
。例如:
.polaroid-filter-img img {
position: relative;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
我认为另一个问题是您的 javascript 函数 initView
。在此函数中,您的以下值出错 height
和 width
:
var width = screen.width * 0.7;
var height = width;
var initialId = $scope.filters[0].id;
请检查控制台日志
中的height
和width
如果它仍然可以帮助您解决问题,请查看另一篇文章