Javascript 画布像素操作

2024-01-28

我有产品图片,每个图片都有两个可配置区域,如下所示: 一、背景 2. 前景

我必须开发一项功能,让客户可以更改两个区域的颜色并保存设计。

我的问题是,我正在遍历图像以读取旧像素值并用新选择的颜色更改它。

位旧像素值不一致。图像上存在纹理效果,这会导致每个像素的像素值发生变化。

我怎样才能实现所需的功能?

或者,如果您可以建议我任何其他方法,那就太好了。

示例图片链接:http://developersbench.com/canvas/img/design_2.jpg http://developersbench.com/canvas/img/design_2.jpg


如果我猜对了,您想要的是将给定颜色“附近”的像素更改为另一种颜色。

我看到的最简单的方法是使用 h,s,l 颜色空间:在这个“自然”颜色空间中,具有相似色调的颜色将被眼睛感知。您可以“改变”色调,同时保持相同的饱和度(==颜色“强度”)和亮度。

因此逐点处理你的图像:
• 将点r、g、b 转换为色调、饱和度、亮度
•?当前的色调与 sourceHue 足够接近吗?
---->> 将其转换为 newHue (保持相同的饱和度/亮度)

小提琴在这里:

http://jsfiddle.net/9GLNP/ http://jsfiddle.net/9GLNP/

您可以尝试使用参数。您提供的纹理的平均色调为 18,因此如果源色调与 18 相差太远,则不会进行任何更改。 8-10 似乎是一个很好的容忍度。

// Provides a new canvas containing [img] where
// all pixels having a hue less than [tolerance] 
// distant from [tgtHue] will be replaced by [newHue]
function shiftHue(img, tgtHue, newHue, tolerance) {
    // normalize inputs
    var normalizedTargetHue = tgtHue / 360;
    var normalizedNewHue = newHue / 360;
    var normalizedTolerance = tolerance / 360;
    // create output canvas
    var cv2 = document.createElement('canvas');
    cv2.width = img.width;
    cv2.height = img.height;
    var ctx2 = cv2.getContext('2d');
    ctx2.drawImage(img, 0, 0);
    // get canvad img data 
    var imgData = ctx2.getImageData(0, 0, img.width, img.height);
    var data = imgData.data;
    var lastIndex = img.width * img.height * 4;
    var rgb = [0, 0, 0];
    var hsv = [0.0, 0.0, 0.0];
    // loop on all pixels
    for (var i = 0; i < lastIndex; i += 4) {
        // retrieve r,g,b (! ignoring alpha !) 
        var r = data[i];
        var g = data[i + 1];
        var b = data[i + 2];
        // convert to hsv
        RGB2HSV(r, g, b, hsv);
        // change color if hue near enough from tgtHue
        var hueDelta = hsv[0] - normalizedTargetHue;
        if (Math.abs(hueDelta) < normalizedTolerance) {
            // adjust hue
            // ??? or do not add the delta ???
            hsv[0] = normalizedNewHue  //+ hueDelta;
            // convert back to rgb
            hsvToRgb(rgb, hsv);
            // store
            data[i] = rgb[0];
            data[i + 1] = rgb[1];
            data[i + 2] = rgb[2];
        }
    }
    ctx2.putImageData(imgData, 0, 0);
    return cv2;
}

编辑 : 为了获得色调,我安慰并记录了色调...;-)但是很多(如果不是全部) 图像软件有一个显示 hsl 的颜色选择器。
对于 hsl,我没有具体的链接。谷歌一下,也可以玩 它在图形软件中。
为了避免编码噩梦,我想你必须决定一个约定 在你使用的纹理上,比如它们是 60 +/- 5 色调或类似的。那么你只需 必须决定游戏的最终色调。检测可能很棘手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 画布像素操作 的相关文章

  • DrawBitmapMesh 如何在 Android Canvas 中工作

    我想在矩形上绘制位图 我使用以下值 this meshWidth 1 this meshHeight 1 this verts new float 8 this points 0 x float this getWidth 4 this p
  • HTML5 canvas:有没有办法通过“最近邻居”重新采样来调整图像大小?

    我有一些 JS 对图像进行一些操作 我想要类似像素艺术的图形 所以我必须在图形编辑器中放大原始图像 但我认为用小图像进行所有操作然后使用 html5 功能放大它是个好主意 这将节省大量处理时间 因为现在my demo http anal s
  • 如何提高Canvas渲染性能?

    我必须画很多Shape http msdn microsoft com en us library system windows shapes shape aspx 约 1 20 万 作为 Canvas 2 的子级 我在 WPF 应用程序中
  • HTML5 - Canvas - 大图像优化

    我需要建立一个HTML5 canvas其中包含非常大的图像 可能高达 10 15MB 我的第一个想法是将图像分成几个块 这些块将在画布上水平移动时加载 对这个想法有什么想法吗 这是一件好事吗 也许我错过了一些已经实现的优化功能 你说得对 这
  • 如何精确缩放已翻译的d3地图

    我有一张已翻译的地图 以使其正确适合画布 我正在尝试实现一种缩放它的方法 它确实有效 但是当您放大时它会远离中心 而不是以鼠标甚至画布为中心 这是我的代码 function map data total views var xy d3 ge
  • 在画布上剪出圆形图像

    我正在使用 html5 canvas 并且我正在创建一个游戏 可以将您的脸部上传到游戏中 并将其用作主要角色 不幸的是 游戏中的角色是圆形的 就像笑脸一样 那么这将如何完成呢 是否可以拍一张照片 然后将其剪成一个圆 这样圆之外的任何东西都是
  • 带滚动条的 HTML 画布

    我正在宽度不等的画布上绘制图表 每个画布可以有自己的滚动条吗 我尝试将所有画布放在一个 div 中并指定最大宽度 但它不起作用 是否有可能所有画布在页面上的可见宽度均为 500 像素 并且每个画布都有其滚动条来查看画布的整个宽度 谢谢 指定
  • webglcontextcreationerror事件:是否同步触发?

    Is the webglcontextcreationerror 事件 https developer mozilla org en US docs Web Events webglcontextcreationerror同步触发还是异步触
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其
  • 导出具有高质量图像的画布的最佳实践是什么?

    我需要你的帮助 我解释一下我的情况 我正在使用 Fabric js 库在我的应用程序中放置形状 文本等 我的画布尺寸为 1000x1000 像素 约 26 45x26 45 厘米 我有一个图像上传脚本 仅用于上传高质量图像 例如 300 d
  • 在 Fabric.js 中进行裁剪的“toDataURL”函数中,Multiplier 属性无法正常工作

    我的原始尺寸canvas is 800X700 我在用clipTo要在画布的选定部分中工作 var rect new fabric Rect left 100 top 50 fill fff width 376 height 602 str
  • HTML5 画布在缩放和旋转后平移

    我正在尝试用画布做一些事情 首先 我让用户上传图像 如果图像比我想要的大 我需要将其缩小 那部分工作得很好 最近我们遇到了 iPhone 用户上传图像的问题 这些都存在方向问题 我已经弄清楚如何提取方向 我的问题是当我操纵画布中的图像时会发
  • fillRect(0,0,0,1)和clearRect()有什么区别

    之间有什么区别 ctx fillStyle rgba 0 0 0 1 ctx fillRect 0 0 100 100 and ctx clearRect 0 0 100 100 性能或生成的图像或画布数据有什么差异吗 更新以对应有问题的
  • 如何在android中画分区的圆?

    我想在我的应用程序中绘制这种类型的圆圈 我可以使用 Canvas 绘制圆圈 但我不知道如何进行分区 谁能建议我如何分割圆 编辑 我想画内圈内的线 提前致谢 这是满足您要求的工作代码 编辑代码 Paint paint1 new Paint P
  • 如何检查图像的特定像素是否透明?

    有什么方法可以检查 PNG 图像的选定 x y 点是否透明 根据 Jeff 的回答 您的第一步是创建 PNG 的画布表示 下面创建一个与图像宽度和高度相同的离屏画布 并在其上绘制图像 var img document getElementB
  • 使用canvas.toDataURL时如何设置crossOrigin属性?

    因此 我尝试为我正在构建的 OpenLayers 3 应用程序创建打印地图函数 我知道他们example http openlayers org en v3 8 2 examples export map html但每当我尝试使用它时 我都
  • 找出在 html5 Canvas 上单击了哪个对象

    假设我有一个 html5 canvas 应用程序 可以在其中将对象放置在绘图画布上 某种图表编辑器 例如 Visio 但更简单 是否有一个框架可以帮助我找到单击 拖动的对象 一个选项是捕获单击事件并迭代我的所有对象 以半智能方式 并检查它是
  • 在overlayImage中应用滤镜的方法在哪里?

    我想在overlayImage中应用一个过滤器 唯一的方法是在渲染后在整个画布上应用过滤器 对此没有内置支持 但很容易 破解 var overlayImageUrl load overlay image first fabric Image
  • WebGL VS Canvas 2D 硬件加速

    这些天 我需要在画布上画很多图像 画布尺寸为800x600px 我有很多256x256px的图像 有些更小 在上面绘制 这些小图像将在画布上组成一个完整的图像 我有两种方法来实现这一点 首先 如果我使用canvas 2D上下文 那就是con
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect

随机推荐

  • 在 Ubuntu Linux 上安装功能齐全的 PostGIS 2.0 GEOS/GDAL 问题

    我一直致力于在 ubuntu maverick amd64 Linux 服务器上启动并运行 postgis 2 0 大约一周 我正在寻求栅格和拓扑支持 我使用以下内容进行配置 sudo configure with raster with
  • JAXB RI ClassFactory 中的空指针异常

    Intro 我和我的朋友正在开发一个 JavaFX 应用程序 该应用程序充当我们学校的规划器 我们有任务 课程作业 活动 课程和学生信息 为了将数据持久存储在用户的硬盘上 我们使用了 JAXB 我们已经注释了我们的类 并且可以成功地将 Ta
  • 使用 Flexbox 具有相同高度元素的多行网格

    我正在尝试创建一个具有多行和多列的网格 我希望使用 Flexbox 使它们都具有相同的高度 但我唯一能得到的是一行上具有相同大小的列 这是我正在尝试做的事情的一个例子 http jsbin com maxavahesa 1 edit htm
  • 如何在 OSX 上替换 Python 中的“关于 Tkinter”菜单

    编辑 我指的是 OSX 应用程序菜单 其中包含 关于 和 首选项 菜单项 以及其他菜单项 对于知道正确搜索词的人来说 也许这将是另一个简单的过程 但是在花费数小时在 IDLE 中跟踪代码并搜索网络之后 我还没有完全能够将这些点联系起来 我正
  • 以编程方式从 DataTable 创建 DataGridview

    我有以下代码 DataTable table new DataTable DataTable is filled with values here DataGridView grid new DataGridView foreach Dat
  • Javascript charAt() 打破多字节字符串

    此代码在 Nodejs v0 10 21 中崩溃 usr bin env node use strict var urlEncoded http zh wikipedia org wiki F0 A8 A8 8F var urlDecode
  • Python请求,如何将内容类型添加到multipart/form-data请求

    我使用 python requests 通过 PUT 方法上传文件 远程 API 仅当正文包含属性时才接受任何请求 Content Type i mage png 不作为请求标头 当我使用 python requests 时 请求因缺少属性
  • 迭代器性能

    与直接使用指针相比 实现和使用迭代器是否会带来任何类型的性能损失 假设我们使用最高的编译器优化 代码来自http www cplusplus com reference iterator iterator http www cplusplu
  • 迭代器实现应该如何处理检查异常?

    我将 java sql RecordSet 包装在 java util Iterator 中 我的问题是 如果任何记录集方法抛出 SQLException 我该怎么办 The java util Iterator javadoc http
  • 如何在eclipse中运行maven项目

    我有一个带有 TestNG 的 Java Maven 项目 我想从 eclipse 运行它 我使用 Eclipse Kepler 并安装了 m2eclipse 插件 但是菜单 Run as 中没有任何与 maven 连接的选项 有人可以帮我
  • 当我单击“确定”按钮时,Android AlertDialog 总是退出

    有没有办法在单击 确定 后进行验证 我没有忽略它 但当我单击 确定 时它会关闭 我编写了一个使用一些编辑文本的自定义 AlertDialog 问题是我无法验证任何内容 如果验证失败 我想更改消息并告诉用户 但它只是关闭 我正在使用Alert
  • Blazor 服务器应用程序中的 HttpContext.Session

    我正在尝试使用HttpContext Session在我的 ASP NET Core Blazor Server 应用程序中 如此处所述MS Doc https learn microsoft com en us aspnet core f
  • TCPDF:将文本剪切到单元格宽度

    我正在广泛使用 TCPDF 的 Cell 方法生成 PDF 报告 使用 Cell 方法打印的文本超出了方法中指定的宽度 我只想打印适合指定宽度的文本部分 但不要溢出或换行到下一行 我不想要字体拉伸策略 我搜索了很多但找不到解决方案 还有其他
  • 如何优雅地为具有多态关联的模型构建表单?

    这是我的模型 class Lesson lt ActiveRecord Base belongs to topic polymorphic gt true validates presence of topic type topic id
  • 如何检测三角形区域的触摸

    对于我的应用程序 我需要将 iPhone 的屏幕对角线分成 4 个部分 并检测哪个部分被触摸 我很困惑 因为我的区域是三角形而不是正方形 我找不到解决方案来检测哪个三角形被触摸 我用 TouchBegan 方法得到了被触摸的点 然后我被卡住
  • 收到电子邮件时电子表格自动更新(发布/订阅)但信息错误[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在 Google Cloud Platform 上设置了第一个 Pub Sub 它使用 Gmail API 在每次收到电子邮件时更新
  • xml 文档中禁止 DTD 异常

    当尝试在 C 应用程序中解析 XML 文档时 我收到此错误 出于安全原因 此 XML 文档中禁止 DTD 要启用 DTD 处理 请将 XmlReaderSettings 上的 ProhibitDtd 属性设置为 false 并将设置传递到
  • 在动态功能模块中找不到@BindindAdapter

    我在应用程序模块中有扩展功能 BindingAdapter imageSrc fun setImageUrl view ImageView userId Int try val drawableRes when userId 6 0 gt
  • 使用网站站长工具测试转义片段搜索

    我的网站是用 AngularJS 编写的 所以我最近创建了所有内容的 HTML 快照 将转义片段标签添加到所有页面的头部 元名称 fragment 内容 然后尝试测试以查看新设置是否在网站站长工具中正常运行 当我查看源代码时 我看到转义的片
  • Javascript 画布像素操作

    我有产品图片 每个图片都有两个可配置区域 如下所示 一 背景 2 前景 我必须开发一项功能 让客户可以更改两个区域的颜色并保存设计 我的问题是 我正在遍历图像以读取旧像素值并用新选择的颜色更改它 位旧像素值不一致 图像上存在纹理效果 这会导