- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
代码
var back1 = {r: 206, g: 77, b: 49}
var back2 = {r: 49, g: 142, b: 66}
var back3 = {r: 66, g: 138, b: 181}
var back4 = {r: 41, g: 81, b: 148}
var back5 = {r: 206, g: 178, b: 49}
var back6 = {r: 165, g: 93, b: 165}
var back7 = {r: 24, g: 32, b: 33}
var back8 = {r: 82, g: 44, b: 115}
var back9 = {r: 24, g: 109, b: 173}
var back10 = {r: 156, g: 40, b: 49}
var back11 = {r: 214, g: 199, b: 198}
var back12 = {r: 41, g: 36, b: 82}
var PATTERN = 1;
defaultImage = "res/img/clan-badge/Pattern_" + PATTERN + ".png";
defaultBackground = back1;
var image = new Image();
image.src = defaultImage;
image.onload = main;
function main(pattern, background) {
background = typeof background !== 'undefined' ? background : defaultBackground;
PATTERN = pattern;
$('#image0').attr("src", defaultImage);
// replace red with green
recolorImage(image, 99, 101, 99, background.r, background.g, background.b);
}
function recolorImage(img, oldRed, oldGreen, oldBlue, newRed, newGreen, newBlue) {
var c = document.createElement('canvas');
var ctx = c.getContext("2d");
var w = img.width;
var h = img.height;
c.width = w;
c.height = h;
// draw the image on the temporary canvas
ctx.drawImage(img, 0, 0, w, h);
// pull the entire image into an array of pixel data
var imageData = ctx.getImageData(0, 0, w, h);
// examine every pixel,
// change any old rgb to the new-rgb
for (var i = 0; i < imageData.data.length; i += 4) {
// is this pixel the old rgb?
if (imageData.data[i] == oldRed && imageData.data[i + 1] == oldGreen && imageData.data[i + 2] == oldBlue) {
// change to your new rgb
imageData.data[i] = newRed;
imageData.data[i + 1] = newGreen;
imageData.data[i + 2] = newBlue;
}
}
// put the altered data back on the canvas
ctx.putImageData(imageData, 0, 0);
// put the re-colored image back on the image
var img1 = document.getElementById("image0");
img1.src = c.toDataURL('image/png');
}
问题
我的问题是当我运行 main()
函数时。它不会更新图像。它确实将 PATTERN 变量更新为我传递给主参数的任何内容,但即使 PATTERN
已更新,html/物理图像也不会更改。这是因为代码先执行,所以无法更新吗?因为如果我刷新页面,它会立即显示我想要的图像,但在重新加载页面时会返回到默认状态。
额外
非常感谢代码改进。如果您还有其他问题,请随时在下面告诉我您的问题是什么。我会尽力为您的问题提供最佳答案。
最佳答案
PATTERN
确实得到更新,但是 defaultImage
不是因为defaultImage = "res/img/clan-badge/Pattern_" + PATTERN + ".png";
仅在 PATTERN
之前运行已更新(在 main()
内)
PATTERN = pattern;
之后把defaultImage = "res/image/clan-badge/Pattern_" + PATTERN + ".png";
.
编辑
以下是我建议的更新摘要:
var back = [
{r: 206, g: 77, b: 49},
{r: 49, g: 142, b: 66},
{r: 66, g: 138, b: 181},
{r: 41, g: 81, b: 148},
{r: 206, g: 178, b: 49},
{r: 165, g: 93, b: 165},
{r: 24, g: 32, b: 33},
{r: 82, g: 44, b: 115},
{r: 24, g: 109, b: 173},
{r: 156, g: 40, b: 49},
{r: 214, g: 199, b: 198},
{r: 41, g: 36, b: 82}
], // use back[0] through back[11] to reference these
defaultImage = 'res/img/clan-badge/Pattern_1.png',
defaultBackground = back[0];
function main(pattern, background) {
var image = typeof pattern !== 'undefined' ? 'res/img/clan-badge/Pattern_' + pattern + '.png' : defaultImage,
img = new Image();
background = typeof background !== 'undefined' ? background : defaultBackground;
img.src = image;
img.onload = function () {
// replace background color
recolorImage(img, 99, 101, 99, background.r, background.g, background.b);
};
}
function recolorImage(img, oldRed, oldGreen, oldBlue, newRed, newGreen, newBlue) {
var c = document.createElement('canvas'),
ctx = c.getContext('2d'),
w = img.width,
h = img.height;
c.width = w;
c.height = h;
// draw the image on the temporary canvas
ctx.drawImage(img, 0, 0, w, h);
// pull the entire image into an array of pixel data
var imageData = ctx.getImageData(0, 0, w, h);
// examine every pixel,
// change any old rgb to the new-rgb
for (var i = 0; i < imageData.data.length; i += 4) {
// is this pixel the old rgb?
if (imageData.data[i] == oldRed && imageData.data[i + 1] == oldGreen && imageData.data[i + 2] == oldBlue) {
// change to your new rgb
imageData.data[i] = newRed;
imageData.data[i + 1] = newGreen;
imageData.data[i + 2] = newBlue;
}
}
// put the altered data back on the canvas
ctx.putImageData(imageData, 0, 0);
// put the re-colored image back on the image
$('#image0').attr('src', c.toDataURL('image/png'));
}
基本上问题是您没有更新 Image
对象的源,并且仅更新 PATTERN
和defaultImage
。我希望这对您有帮助。
替代方案
如果我可以建议进一步更改,为什么不为所需的每个背景创建图像,这样您就不需要 Canvas API 逐像素编辑它了?也许像 res/img/clan-badge/PATTERN/BACKGROUND/image.png
这样的路径或其他什么。
另一种选择是使每个徽章的背景部分透明(因为它们是 PNG 图像),并将图像加载到 DOM 中后,只需设置 <img>
的背景颜色即可。通过 CSS 从 back
到 RGB 三元组数组,再次避免使用 Canvas API 进行逐像素编辑,如下所示:
function main(pattern, background) {
// assuming image is transparent where background will show through
var image = typeof pattern !== 'undefined' ? 'res/img/clan-badge/Pattern_' + pattern + '.png' : defaultImage;
background = typeof background !== 'undefined' ? background : defaultBackground;
$('#image0')
.attr('src', image)
// set background through CSS
.css('background-color', 'rgb(' + background.r + ',' + background.g + ',' + background.b + ')');
}
关于javascript - 为什么我的图片没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875884/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!