0

私はこのコードをcofescriptに持っています:

fs = require 'fs'

class PpmCanvas


  constructor: (@width, @height, @fileName) ->
        size = @width * @height * 3

        array = new Uint8ClampedArray size
        @buffer = new Buffer array

        for element, index in @buffer
            @buffer.writeUInt8 128, index


    plot: (x, y, r, g, b) ->
        true

    save: () -> 
        header = new Buffer "P6 #{@width} #{@height} 255\n"

        together = Buffer.concat([header, @buffer])

        fs.open @fileName, 'w', (err, fd) =>
            if err
                throw err

            fs.write fd, together.toString(), undefined, undefined, (err, written, buffer ) =>
                fs.close fd
canvas = new PpmCanvas 200, 200, 'image.ppm'
canvas.save()

ppm 画像クラスを作成しようとしていますが、画像をディスクに保存する際に問題があります。したがって、最初に Uint8Clamped 配列を作成してピクセル データを保持し、それを Buffer でラップして、後でディスクに書き込めるようにします。そして、すべてのピクセルを何らかの値に設定して、ループ内に初期色を設定します。値が 0..127 の範囲内にある限り、すべて問題なく、すべてのバイトが 1 バイトとしてファイルに書き込まれますが、値が 127 より大きい場合、すべてのバイトが 2 バイトとしてディスクに書き込まれ、イメージが壊れます。 . バッファエンコーディングを「バイナリ」などに設定しようとしましたが、それでも2バイトとして書き込まれます.ノードを使用してバイナリデータをディスクに書き込む正しい方法を教えてください.

4

1 に答える 1

0

fs.write引数が Buffer であることを期待します。また、引数がありません。fs.writeFileただし、実際には単純化のために使用する必要があります。

// Add the missing 3rd arg and don't use 'undefined'.
fs.write fd, together, 0, together.length, 0, (err, written, buffer) ->

// Or just use this and drop the 'fs.open' call.
fs.writeFile @fileName, together
于 2013-04-08T22:45:41.957 に答える