node-canvas is a Cairo-backed Canvas implementation for Node.js.node canvas是Node.js的Cairo支持的画布实现。
$ npm install canvas
By default, binaries for macOS, Linux and Windows will be downloaded. 默认情况下,将下载macOS、Linux和Windows的二进制文件。If you want to build from source, use 如果要从源代码构建,请使用npm install --build-from-source
and see the Compiling section below.npm install --build-from-source
,并参阅下面的编译部分。
The minimum version of Node.js required is 6.0.0.所需的Node.js的最低版本为6.0.0
。
If you don't have a supported OS or processor architecture, or you use 如果您没有受支持的操作系统或处理器体系结构,或者您使用--build-from-source
, the module will be compiled on your system. --build-from-source
,那么该模块将在您的系统上编译。This requires several dependencies, including Cairo and Pango.这需要几个依赖项,包括Cairo和Pango。
For detailed installation information, see the wiki. 有关详细的安装信息,请参阅维基。One-line installation instructions for common OSes are below. 下面是常见操作系统的单线安装说明。Note that libgif/giflib, librsvg and libjpeg are optional and only required if you need GIF, SVG and JPEG support, respectively. Cairo v1.10.0 or later is required.请注意,libgif/giflib、librsvg和libjpeg是可选的,仅当您分别需要GIF、SVG和JPEG支持时才需要。需要Cairo v1.10.0或更高版本。
OS | Command |
---|---|
OS X | Using Homebrew:brew install pkg-config cairo pango libpng jpeg giflib librsvg |
Ubuntu | sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev |
Fedora | sudo yum install gcc-c++ cairo-devel pango-devel libjpeg-turbo-devel giflib-devel |
Solaris | pkgin install cairo pango pkg-config xproto renderproto kbproto xextproto |
OpenBSD | doas pkg_add cairo pango png jpeg giflib |
Windows | |
Others | See the wiki |
Mac OS X v10.11+: If you have recently updated to Mac OS X v10.11+ and are experiencing trouble when compiling, run the following command: 如果您最近更新到Mac OS X v10.11+,并且在编译时遇到问题,请运行以下命令:xcode-select --install
. Read more about the problem on Stack Overflow.阅读有关堆栈溢出问题的更多信息。
If you have xcode 10.0 or higher installed, in order to build from source you need NPM 6.4.1 or higher.如果您安装了xcode 10.0或更高版本,则为了从源代码构建,您需要NPM 6.4.1或更高。
const { createCanvas, loadImage } = require('canvas')
const canvas = createCanvas(200, 200)
const ctx = canvas.getContext('2d')
// Write "Awesome!"
ctx.font = '30px Impact'
ctx.rotate(0.1)
ctx.fillText('Awesome!', 50, 100)
// Draw line under text
var text = ctx.measureText('Awesome!')
ctx.strokeStyle = 'rgba(0,0,0,0.5)'
ctx.beginPath()
ctx.lineTo(50, 102)
ctx.lineTo(50 + text.width, 102)
ctx.stroke()
// Draw cat with lime helmet
loadImage('examples/images/lime-cat.jpg').then((image) => {
ctx.drawImage(image, 50, 0, 70, 70)
console.log('<img src="' + canvas.toDataURL() + '" />')
})
See the changelog for a guide to upgrading from 1.x to 2.x.有关从1x升级到2x的指南,请参阅更改日志。
For version 1.x documentation, see the v1.x branch.有关1x版本的文档,请参阅v1.x分支。
This project is an implementation of the Web Canvas API and implements that API as closely as possible. 该项目是WebCanvas API的实现,并尽可能接近地实现API。For API documentation, please visit Mozilla Web Canvas API. 有关API文档,请访问Mozilla Web Canvas API。(See Compatibility Status for the current API compliance.) (有关当前API合规性,请参阅兼容性状态。)All utility methods and non-standard APIs are documented below.下面介绍了所有实用程序方法和非标准API。
createCanvas(width: number, height: number, type?: 'PDF'|'SVG') => Canvas
Creates a Canvas instance. This method works in both Node.js and Web browsers, where there is no Canvas constructor. (See 创建画布实例。这个方法在Node.js和Web浏览器中都有效,因为它们没有Canvas构造函数。(有关在浏览器中运行的实现,请参阅browser.js
for the implementation that runs in browsers.)browser.js
。)
const { createCanvas } = require('canvas')
const mycanvas = createCanvas(200, 200)
const myPDFcanvas = createCanvas(600, 800, 'pdf') // see "PDF Support" section
createImageData(width: number, height: number) => ImageData createImageData(data: Uint8ClampedArray, width: number, height?: number) => ImageData // for alternative pixel formats: createImageData(data: Uint16Array, width: number, height?: number) => ImageData
Creates an ImageData instance. 创建ImageData实例。This method works in both Node.js and Web browsers.这种方法适用于Node.js和Web浏览器。
const { createImageData } = require('canvas')
const width = 20, height = 20
const arraySize = width * height * 4
const mydata = createImageData(new Uint8ClampedArray(arraySize), width)
loadImage() => Promise<Image>
Convenience method for loading images. 加载图像的便捷方法。This method works in both Node.js and Web browsers.这种方法适用于Node.js和Web浏览器。
const { loadImage } = require('canvas')
const myimg = loadImage('http://server.com/image.png')
myimg.then(() => {
// do something with image
}).catch(err => {
console.log('oh no!', err)
})
// or with async/await:
const myimg = await loadImage('http://server.com/image.png')
// do something with image
registerFont(path: string, { family: string, weight?: string, style?: string }) => void
To use a font file that is not installed as a system font, use 要使用未安装为系统字体的字体文件,请使用registerFont()
to register the font with Canvas. registerFont()
在画布上注册字体。This must be done before the Canvas is created.这必须在创建画布之前完成。
const { registerFont, createCanvas } = require('canvas')
registerFont('comicsans.ttf', { family: 'Comic Sans' })
const canvas = createCanvas(500, 500)
const ctx = canvas.getContext('2d')
ctx.font = '12px "Comic Sans"'
ctx.fillText('Everyone hates this font :(', 250, 10)
The second argument is an object with properties that resemble the CSS properties that are specified in 第二个参数是一个对象,其属性类似于@font-face
rules. You must specify at least family
. weight
, and style
are optional and default to 'normal'
.@font-face
规则中指定的CSS属性。您必须至少指定family
。weight
和style
是可选的并且默认为'normal'
。
img.src: string|Buffer
As in browsers, 与在浏览器中一样,img.src
can be set to a data:
URI or a remote URL. img.src
可以设置为data:
URI或远程URL。In addition, node-canvas allows setting 此外,nodecanvas允许将src
to a local file path or Buffer
instance.src
设置为本地文件路径或Buffer
实例。
const { Image } = require('canvas')
// From a buffer:
fs.readFile('images/squid.png', (err, squid) => {
if (err) throw err
const img = new Image()
img.onload = () => ctx.drawImage(img, 0, 0)
img.onerror = err => { throw err }
img.src = squid
})
// From a local file path:
const img = new Image()
img.onload = () => ctx.drawImage(img, 0, 0)
img.onerror = err => { throw err }
img.src = 'images/squid.png'
// From a remote URL:
img.src = 'http://picsum.photos/200/300'
// ... as above
// From a `data:` URI:
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
// ... as above
Note: In some cases, 注意:在某些情况下,img.src=
is currently synchronous. img.src=
当前是同步的。However, you should always use 但是,您应该始终使用img.onload
and img.onerror
, as we intend to make img.src=
always asynchronous as it is in browsers. img.onload
和img.onerror
,因为我们打算使img.src=
始终像在浏览器中一样异步。See https://github.com/Automattic/node-canvas/issues/1007.请参阅https://github.com/Automattic/node-canvas/issues/1007。
img.dataMode: number
Applies to JPEG images drawn to PDF canvases only.仅适用于绘制到PDF画布的JPEG图像。
Setting 设置img.dataMode = Image.MODE_MIME
or Image.MODE_MIME|Image.MODE_IMAGE
enables MIME data tracking of images. img.dataMode = Image.MODE_MIME
或Image.MODE_MIME|Image.MODE_IMAGE
可启用图像的MIME数据跟踪。When MIME data is tracked, PDF canvases can embed JPEGs directly into the output, rather than re-encoding into PNG. This can drastically reduce filesize and speed up rendering.当MIME数据被跟踪时,PDF画布可以将JPEG直接嵌入到输出中,而不是重新编码到PNG中。这可以大大减少文件大小并加快渲染速度。
const { Image, createCanvas } = require('canvas')
const canvas = createCanvas(w, h, 'pdf')
const img = new Image()
img.dataMode = Image.MODE_IMAGE // Only image data tracked
img.dataMode = Image.MODE_MIME // Only mime data tracked
img.dataMode = Image.MODE_MIME | Image.MODE_IMAGE // Both are tracked
If working with a non-PDF canvas, image data must be tracked; otherwise the output will be junk.如果使用非PDF画布,则必须跟踪图像数据;否则输出将是垃圾。
Enabling mime data tracking has no benefits (only a slow down) unless you are generating a PDF.启用mime数据跟踪没有任何好处(只是速度减慢),除非您正在生成PDF。
canvas.toBuffer((err: Error|null, result: Buffer) => void, mimeType?: string, config?: any) => void canvas.toBuffer(mimeType?: string, config?: any) => Buffer
Creates a 创建表示画布中包含的图像的Buffer
object representing the image contained in the canvas.Buffer
对象。
raw
or for PDF or SVG canvases.raw
或PDF或SVG画布不支持。image/png
, image/jpeg
(if node-canvas was built with JPEG support), raw
(unencoded data in BGRA order on little-endian (most) systems, ARGB on big-endian systems; top-to-bottom), application/pdf
(for PDF canvases) and image/svg+xml
(for SVG canvases). image/png
、image/jpeg
(如果节点画布是使用jpeg支持构建的)、raw
(在小端(大多数)系统上按BGRA顺序的未编码数据,在大端系统上为ARGB);从上到下)、application/pdf
(用于pdf画布)和image/svg+xml
(用于svg画布)。image/png
for image canvases, or the corresponding type for PDF or SVG canvas.image/png
,PDF或SVG画布默认为相应类型。For 对于image/jpeg
, an object specifying the quality (0 to 1), if progressive compression should be used and/or if chroma subsampling should be used: {quality: 0.75, progressive: false, chromaSubsampling: true}
. image/jpeg
,指定质量(0到1)的对象,是否应使用渐进压缩和/或是否应使用色度子采样:{quality: 0.75, progressive: false, chromaSubsampling: true}
。All properties are optional.所有属性都是可选的。
For 对于image/png
, an object specifying the ZLIB compression level (between 0 and 9), the compression filter(s), the palette (indexed PNGs only), the the background palette index (indexed PNGs only) and/or the resolution (ppi): image/png
,一个指定ZLIB压缩级别(介于0和9之间)、压缩筛选器、调色板(仅索引png)、背景调色板索引(仅索引PN G)和/或分辨率(ppi)的对象:{compressionLevel: 6, filters: canvas.PNG_ALL_FILTERS, palette: undefined, backgroundIndex: 0, resolution: undefined}
. All properties are optional.。所有属性都是可选的。
Note that the PNG format encodes the resolution in pixels per meter, so if you specify 请注意,PNG格式以每米像素为单位对分辨率进行编码,因此如果指定96
, the file will encode 3780 ppm (~96.01 ppi). 96
,则文件将编码3780 ppm(96.01 ppi)。The resolution is undefined by default to match common browser behavior.默认情况下,分辨率未定义,以匹配常见的浏览器行为。
For 对于application/pdf
, an object specifying optional document metadata: application/pdf
,指定可选文档元数据的对象:{title: string, author: string, subject: string, keywords: string, creator: string, creationDate: Date, modDate: Date}
. All properties are optional and default to 。所有属性都是可选的,默认为undefined
, except for creationDate
, which defaults to the current date. Adding metadata requires Cairo 1.16.0 or later.undefined
,creationDate
除外,默认为当前日期。添加元数据需要Cairo 1.16.0或更高版本。
For a description of these properties, see page 550 of PDF 32000-1:2008.有关这些属性的描述,请参阅PDF 32000-1:2008第550页。
Note that there is no standard separator for 请注意,keywords
. keywords
没有标准的分隔符。A space is recommended because it is in common use by other applications, and Cairo will enclose the list of keywords in quotes if a comma or semicolon is used.建议使用空格,因为其他应用程序通常使用空格,如果使用逗号或分号,Cairo会将关键字列表用引号括起来。
Return value返回值
If no callback is provided, a 如果没有提供回调,则为Buffer
. If a callback is provided, none.Buffer
。如果提供回调,则不提供。
// Default: buf contains a PNG-encoded image默认值:buf包含PNG编码的图像
const buf = canvas.toBuffer()
// PNG-encoded, zlib compression level 3 for faster compression but bigger files, no filteringPNG编码,zlib压缩级别3,压缩速度更快,但文件更大,无需筛选
const buf2 = canvas.toBuffer('image/png', { compressionLevel: 3, filters: canvas.PNG_FILTER_NONE })
// JPEG-encoded, 50% qualityJPEG编码,50%质量
const buf3 = canvas.toBuffer('image/jpeg', { quality: 0.5 })
// Asynchronous PNG异步PNG
canvas.toBuffer((err, buf) => {
if (err) throw err // encoding failed编码失败
// buf is PNG-encoded image
})
canvas.toBuffer((err, buf) => {
if (err) throw err // encoding failed
// buf is JPEG-encoded image at 95% quality
}, 'image/jpeg', { quality: 0.95 })
// BGRA pixel values, native-endianBGRA像素值,原生端序
const buf4 = canvas.toBuffer('raw')
const { stride, width } = canvas
// In memory, this is `canvas.height * canvas.stride` bytes long.
// The top row of pixels, in BGRA order on little-endian hardware,在little-endian硬件上按BGRA顺序排列的最上面一行像素,
// left-to-right, is:从左到右为:
const topPixelsBGRALeftToRight = buf4.slice(0, width * 4)
// And the third row is:第三行是:
const row3 = buf4.slice(2 * stride, 2 * stride + width * 4)
// SVG and PDF canvases
const myCanvas = createCanvas(w, h, 'pdf')
myCanvas.toBuffer() // returns a buffer containing a PDF-encoded canvas返回包含PDF编码画布的缓冲区
// With optional metadata:使用可选元数据:
myCanvas.toBuffer('application/pdf', {
title: 'my picture',
keywords: 'node.js demo cairo',
creationDate: new Date()
})
canvas.createPNGStream(config?: any) => ReadableStream
Creates a 创建一个ReadableStream
that emits PNG-encoded data.ReadableStream
,用于发出PNG编码的数据。
config
{compressionLevel: 6, filters: canvas.PNG_ALL_FILTERS, palette: undefined, backgroundIndex: 0, resolution: undefined}
const fs = require('fs')
const out = fs.createWriteStream(__dirname + '/test.png')
const stream = canvas.createPNGStream()
stream.pipe(out)
out.on('finish', () => console.log('The PNG file was created.'))
To encode indexed PNGs from canvases with 要使用pixelFormat: 'A8'
or 'A1'
, provide an options object:pixelFormat: 'A8'
或'A1'
对画布中的索引PNG进行编码,请提供一个选项对象:
const palette = new Uint8ClampedArray([
//r g b a
0, 50, 50, 255, // index 1
10, 90, 90, 255, // index 2
127, 127, 255, 255
// ...
])
canvas.createPNGStream({
palette: palette,
backgroundIndex: 0 // optional, defaults to 0
})
canvas.createJPEGStream(config?: any) => ReadableStream
Creates a 创建一个ReadableStream
that emits JPEG-encoded data.ReadableStream
,用于发送JPEG编码的数据。
Note: At the moment, 注意:目前,createJPEGStream()
is synchronous under the hood. That is, it runs in the main thread, not in the libuv threadpool.createJPEGStream()
是同步的。也就是说,它在主线程中运行,而不是在libuv线程池中运行。
config
{quality: 0.75, progressive: false, chromaSubsampling: true}
const fs = require('fs')
const out = fs.createWriteStream(__dirname + '/test.jpeg')
const stream = canvas.createJPEGStream()
stream.pipe(out)
out.on('finish', () => console.log('The JPEG file was created.'))
// Disable 2x2 chromaSubsampling for deeper colors and use a higher quality禁用2x2色度子采样以获得更深的颜色并使用更高的质量
const stream = canvas.createJPEGStream({
quality: 0.95,
chromaSubsampling: false
})
canvas.createPDFStream(config?: any) => ReadableStream
config
{title: string, author: string, subject: string, keywords: string, creator: string, creationDate: Date, modDate: Date}
toBuffer()
for more information. toBuffer()
。Applies to PDF canvases only. Creates a 仅适用于PDF画布。创建一个ReadableStream
that emits the encoded PDF. ReadableStream
,用于发出编码的PDF。canvas.toBuffer()
also produces an encoded PDF, but 也会生成编码的PDF,但createPDFStream()
can be used to reduce memory usage.createPDFStream()
可以用于减少内存使用。
This is a standard API, but several non-standard calls are supported. The full list of supported calls is:这是一个标准的API,但支持几个非标准调用。支持的调用的完整列表为:
dataUrl = canvas.toDataURL() // defaults to PNG
dataUrl = canvas.toDataURL('image/png')
dataUrl = canvas.toDataURL('image/jpeg')
dataUrl = canvas.toDataURL('image/jpeg', quality) // quality from 0 to 1
canvas.toDataURL((err, png) => { }) // defaults to PNG
canvas.toDataURL('image/png', (err, png) => { })
canvas.toDataURL('image/jpeg', (err, jpeg) => { }) // sync JPEG is not supported
canvas.toDataURL('image/jpeg', {...opts}, (err, jpeg) => { }) // see Canvas#createJPEGStream for valid options
canvas.toDataURL('image/jpeg', quality, (err, jpeg) => { }) // spec-following; quality from 0 to 1
context.patternQuality: 'fast'|'good'|'best'|'nearest'|'bilinear'
Defaults to 默认为'good'
. 'good'
。Affects pattern (gradient, image, etc.) rendering quality.影响图案(渐变、图像等)渲染质量。
context.quality: 'fast'|'good'|'best'|'nearest'|'bilinear'
Defaults to 默认为'good'
. Like patternQuality
, but applies to transformations affecting more than just patterns.'good'
。与patternQuality
类似,但适用于影响图案的变换。
context.textDrawingMode: 'path'|'glyph'
Defaults to 默认为'path'
. The effect depends on the canvas type:'path'
。效果取决于画布类型:
Standard (image) glyph
and path
both result in rasterized text. glyph
和path
都会产生光栅化的文本。Glyph mode is faster than 字形模式比path
, but may result in lower-quality text, especially when rotated or translated.path
快,但可能会导致文本质量较低,尤其是在旋转或翻译时。
PDF glyph
will embed text instead of paths into the PDF. 将在PDF中嵌入文本而不是路径。This is faster to encode, faster to open with PDF viewers, yields a smaller file size and makes the text selectable. 这可以更快地编码,更快地使用PDF查看器打开,产生更小的文件大小,并使文本可以选择。The subset of the font needed to render the glyphs will be embedded in the PDF. This is usually the mode you want to use with PDF canvases.渲染字形所需的字体子集将嵌入PDF中。这通常是您想要用于PDF画布的模式。
SVG glyph
does not cause <text>
elements to be produced as one might expect (cairo bug). Rather, glyph
will create a <defs>
section with a <symbol>
for each glyph, then those glyphs be reused via <use>
elements. path
mode creates a <path>
element for each text string. glyph
mode is faster and yields a smaller file size.
In 在字形模式中,glyph
mode, ctx.strokeText()
and ctx.fillText()
behave the same (aside from using the stroke and fill style, respectively).ctx.strokeText()
和ctx.fillText()
的行为相同(除了分别使用笔划和填充样式之外)。
This property is tracked as part of the canvas state in save/restore.此属性在保存/还原时作为画布状态的一部分进行跟踪。
In addition to all of the standard global composite operations defined by the Canvas specification, the 'saturate' operation is also available.除了Canvas规范定义的所有标准全局合成操作之外,“饱和”操作也可用。
context.antialias: 'default'|'none'|'gray'|'subpixel'
Sets the anti-aliasing mode.设置抗锯齿模式。
node-canvas can create PDF documents instead of images. Node画布可以创建PDF文档而不是图像。The canvas type must be set when creating the canvas as follows:创建画布时,必须按如下方式设置画布类型:
const canvas = createCanvas(200, 500, 'pdf')
An additional method 然后可以使用一个额外的方法.addPage()
is then available to create multiple page PDFs:.addPage()
来创建多个页面PDF:
// On first page
ctx.font = '22px Helvetica'
ctx.fillText('Hello World', 50, 80)
ctx.addPage()
// Now on second page
ctx.font = '22px Helvetica'
ctx.fillText('Hello World 2', 50, 80)
canvas.toBuffer() // returns a PDF file
canvas.createPDFStream() // returns a ReadableStream that emits a PDF
// With optional document metadata (requires Cairo 1.16.0):
canvas.toBuffer('application/pdf', {
title: 'my picture',
keywords: 'node.js demo cairo',
creationDate: new Date()
})
It is also possible to create pages with different sizes by passing 还可以通过将width
and height
to the .addPage()
method:width
和height
传递给addPage()
方法来创建不同大小的页面:
ctx.font = '22px Helvetica'
ctx.fillText('Hello World', 50, 80)
ctx.addPage(400, 800)
ctx.fillText('Hello World 2', 50, 80)
See also:
node-canvas can create SVG documents instead of images. Node画布可以创建SVG文档而不是图像。The canvas type must be set when creating the canvas as follows:创建画布时,必须按如下方式设置画布类型:
const canvas = createCanvas(200, 500, 'svg')
// Use the normal primitives.
fs.writeFileSync('out.svg', canvas.toBuffer())
If librsvg is available when node-canvas is installed, node-canvas can render SVG images to your canvas context. 如果在安装Node画布时librsvg可用,则Node画布可以将SVG图像呈现到画布上下文中。This currently works by rasterizing the SVG image (i.e. drawing an SVG image to an SVG canvas will not preserve the SVG data).目前,这是通过光栅化SVG图像来实现的(即,将SVG图像绘制到SVG画布将不会保留SVG数据)。
const img = new Image()
img.onload = () => ctx.drawImage(img, 0, 0)
img.onerror = err => { throw err }
img.src = './example.svg'
node-canvas has experimental support for additional pixel formats, roughly following the Canvas color space proposal.
const canvas = createCanvas(200, 200)
const ctx = canvas.getContext('2d', { pixelFormat: 'A8' })
By default, canvases are created in the RGBA32
format, which corresponds to the native HTML Canvas behavior. Each pixel is 32 bits. The JavaScript APIs that involve pixel data (getImageData
, putImageData
) store the colors in the order {red, green, blue, alpha} without alpha pre-multiplication. (The C++ API stores the colors in the order {alpha, red, green, blue} in native-endian ordering, with alpha pre-multiplication.)
These additional pixel formats have experimental support:这些额外的像素格式提供了实验支持:
RGB24
Like RGBA32
, but the 8 alpha bits are always opaque. This format is always used if the alpha
context attribute is set to false (i.e. canvas.getContext('2d', {alpha: false})
). This format can be faster than RGBA32
because transparency does not need to be calculated.A8
Each pixel is 8 bits. This format can either be used for creating grayscale images (treating each byte as an alpha value), or for creating indexed PNGs (treating each byte as a palette index) (see the example using alpha values with fillStyle
and the example using imageData
).RGB16_565
Each pixel is 16 bits, with red in the upper 5 bits, green in the middle 6 bits, and blue in the lower 5 bits, in native platform endianness. Some hardware devices and frame buffers use this format. Note that PNG does not support this format; when creating a PNG, the image will be converted to 24-bit RGB. This format is thus suboptimal for generating PNGs. ImageData
instances for this mode use a Uint16Array
instead of a Uint8ClampedArray
.A1
RGB30
Notes and caveats:
Using a non-default format can affect the behavior of APIs that involve pixel data:使用非默认格式可能会影响涉及像素数据的API的行为:
context2d.createImageData
context2d.getImageData
os.endianness()
function.os.endianness()
函数来确定。context2d.putImageData
As above.A1
and RGB30
do not yet support getImageData
or putImageData
. Have a use case and/or opinion on working with these formats? Open an issue and let us know! (See #935.)有使用这些格式的用例和/或意见吗?打开一个问题,让我们知道!(参见#935。)
A1
, A8
, RGB30
and RGB16_565
with shadow blurs may crash or not render properly.
The ImageData(width, height)
and ImageData(Uint8ClampedArray, width)
constructors assume 4 bytes per pixel. To create an ImageData
instance with a different number of bytes per pixel, use new ImageData(new Uint8ClampedArray(size), width, height)
or new ImageData(new Uint16ClampedArray(size), width, height)
.
First make sure you've built the latest version. 首先确保你已经建立了最新的版本。Get all the deps you need (see compiling above), and run:获取所需的所有dep(请参阅上面的编译),然后运行:
npm install --build-from-source
For visual tests: 对于视觉测试:npm run test-server
and point your browser to http://localhost:4000.npm run test-server
并将浏览器指向http://localhost:4000。
For unit tests: 对于单元测试:npm run test
.npm run test
。
Benchmarks live in the 基准位于benchmarks
directory.benchmarks
目录中。
Examples line in the examples
directory. Most produce a png image of the same name, and others such as live-clock.js launch an HTTP server to be viewed in the browser.examples
目录中的Examples行。大多数都会生成相同名称的png图像,而其他一些(如live-clock.js)则会启动HTTP服务器以在浏览器中查看。
(The MIT License)
Copyright (c) 2010 LearnBoost, and contributors <dev@learnboost.com>
Copyright (c) 2014 Automattic, Inc and contributors <dev@automattic.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:特此免费授予获得本软件副本和相关文档文件(“软件”)的任何人在不受限制的情况下处理本软件的权限,包括但不限于使用、复制、修改、合并、发布、分发、分许可和/或出售本软件副本的权利,并允许向其提供本软件的人员这样做,符合以下条件:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.软件是“按原样”提供的,没有任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵权的保证。在任何情况下,作者或版权持有人均不对因软件或软件的使用或其他交易而产生、产生或与之相关的任何索赔、损害赔偿或其他责任承担责任,无论是在合同诉讼、侵权诉讼还是其他诉讼中。
See license