使用 JavaScript 而不是 RGBA 生成 RGB 图像
Generating an RGB image using javascript instead of an RGBA
我目前正在使用context.createImageData(width, height)
创建带有HTML5画布的RGBA图像。但是,我不需要操作图像 alpha 值,因此我正在创建的数组比它需要的要大得多。有没有办法使用类似的方法来创建RGB图像数据?
你根本无法使用画布。
Canvas 将始终根据规范为您提供 RGBA 缓冲区(它产生 RGB 的唯一例外是当您使用 toDataURL
生成 JPEG 时)。
您可以简单地忽略 alpha 通道并将其保留为值 255,或者创建一个仅包含您操作的 RGB 值的自定义类型化数组缓冲区,然后将数据复制到画布的像素数组。
var myBuffer = new ArrayBuffer(3 * w * h); /// calc buffer size in bytes
var pixels = new Uint8ClampedArray(myBuffer); /// view for buffer
Uint8ClampedArray
是与画布使用的缓冲区视图相同类型的缓冲区视图。
然后在数据准备就绪时将值从pixels
复制到图像数据:
var imageData = ctx.createImageData(w, h); /// create a canvas buffer (RGBA)
var data = imageData.data; /// view for the canvas buffer
var len = data.length; /// length of buffer
var i = 0; /// cursor for RGBA buffer
var t = 0; /// cursor for RGB buffer
for(; i < len; i += 4) {
data[i] = pixels[t]; /// copy RGB data to canvas from custom array
data[i + 1] = pixels[t + 1];
data[i + 2] = pixels[t + 2];
data[i + 3] = 255; /// remember this one with createImageBuffer
t += 3;
}
ctx.putImageData(imageData, 0, 0); /// put data to canvas
(当然,两个缓冲区的宽度和高度需要匹配)。
这种方法是否有益很大程度上取决于您是否对图像进行了大量处理。如果不是,那么这只会使用更多内存,并且不会在性能方面带来太大好处。
根据您将处理的方式和内容,还可以将Uint32Array
与自定义缓冲区一起使用(除了Uint8ClampedArray
之外 - 您可以在缓冲区上拥有任意数量的视图),这对于像素置换等很有用。
相关文章:
- 如何在生成下载文件时显示加载动画
- 自动生成的用户名
- Javascript生成的表单未提交
- 比较从函数和生成的日期对象
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 正在获取生成的PHP td值
- javascript:如何在antlr生成的Lexer中进行错误处理
- 如何在从多选下拉列表中选择选项值时动态生成文本框
- 从控制器继承了隔离的作用域以生成可重用的指令
- 使用当前日期生成随机id
- 下载使用POST数据动态生成的文件
- Steam Web API:I'我不知道该如何处理这个看起来像哈希的url来生成图像
- 使用Javascript生成包含JSP的HTML
- 生成pdf或其他非html文件时的错误处理
- 使用jQuery根据动态生成的html动态添加html
- 你能用来自数组的属性名称生成一个对象吗
- 使用 JavaScript 而不是 RGBA 生成 RGB 图像
- 自动生成十六进制rgb颜色