2012-06-28 36 views
17

Có cách nào dễ dàng trong Node.js để đọc tệp PNG và nhận được pixel của hình ảnh không? Một cái gì đó như node-image, nhưng cách khác :)Đọc hình ảnh PNG trong Node.js

tôi đã đi qua các thư viện được liệt kê ở https://github.com/joyent/node/wiki/modules#wiki-graphics, nhưng họ là một trong hai giấy gói đơn giản xung quanh các công cụ dòng lệnh cung cấp cắt xén và thay đổi kích thước hoặc các công cụ vẽ phức tạp như node-canvas.

+2

Tại sao '' node-canvas'' không hoạt động cho bạn? Đẩy png vào canvas và sau đó poke tại các điểm ảnh trong canvas: http://falcon80.com/HTMLCanvas/PixelManipulation/getImageData.html –

+1

@ david-ellis Cảm ơn bạn, tôi có thể sẽ sử dụng nó, nhưng tôi tự hỏi liệu có là thư viện chỉ đọc hình ảnh. Toàn bộ canvas với Cairo rendering có vẻ hơi quá mức. –

+0

Có thể thư viện sẽ không quá khó để viết, nhưng xem xét Node.js mới như thế nào, tôi nghi ngờ rằng một thư viện như vậy vẫn tồn tại. –

Trả lời

18

Cái này hiện cả hai PNG giải mã và mã hóa mà không dependancies mẹ đẻ:

pngjs2 - PNG encoder/decoder for Node.js with no native dependencies.

Một ví dụ cho đảo ngược màu sắc của a PNG:

var fs = require('fs'), 
PNG = require('pngjs2').PNG; 

fs.createReadStream('in.png') 
    .pipe(new PNG()) 
    .on('parsed', function() { 

    for (var y = 0; y < this.height; y++) { 
     for (var x = 0; x < this.width; x++) { 
      var idx = (this.width * y + x) << 2; 

      // invert color 
      this.data[idx] = 255 - this.data[idx]; 
      this.data[idx+1] = 255 - this.data[idx+1]; 
      this.data[idx+2] = 255 - this.data[idx+2]; 

      // and reduce opacity 
      this.data[idx+3] = this.data[idx+3] >> 1; 
     } 
    } 

    this.pack().pipe(fs.createWriteStream('out.png')); 
}); 
+1

+1 Tôi nghĩ rằng tôi thích cái này cho lib được đề xuất của tôi. Cảm ơn! –

+0

Xin lỗi, bạn có thể xem câu hỏi của tôi tại đây https://stackoverflow.com/questions/46186815/noise-in-png-produced-by-pngjs-for-nodejs? Tôi đang gặp rắc rối với PNG được sản xuất bởi pngjs - nó ồn ào ... – kolyaseg

15

tôi sắp sửa trở thành tìm kiếm điên, nhưng tôi tìm thấy một:

png.js ― A PNG decoder in JS for the canvas element or Node.js.

var PNG = require('png-js'); 

var myimage = new PNG('myimage.png'); 

var width = myimage.width; 
var height = myimage.height; 

myimage.decode(function (pixels) { 
    //Pixels is a 1D array containing pixel data 
}); 

Xin lưu ý đó là tinh khiết JavaScript. Hoạt động cả trong trình duyệt <canvas> và trong Nút.JS.

Có nhiều thuộc tính ngoài widthheight, xem this source.

+0

Ồ, điều này có vẻ tuyệt vời, nhưng khi tôi gọi PNG.decode, tôi nhận được một mảng pixel một chiều (theo [README] (https://github.com/devongovett/ png.js/blob/master/README.md), [mã] (https://github.com/devongovett/png.js/blob/master/png-node.coffee) và bài kiểm tra đơn giản của tôi). Bạn có biết làm thế nào tôi có thể nhận được chiều rộng và chiều cao?:) –

+0

Vâng, mô-đun không được tài liệu rất tốt. Tôi sẽ cập nhật câu trả lời của mình. –

+1

Aha, cảm ơn bạn, điều này rất gần; nhưng tôi nghĩ rằng các nhà xây dựng PNG mong đợi các byte thực tế của hình ảnh, vì vậy bạn phải đọc các tập tin chính mình. Nó có thể bị mắc kẹt trong một vòng lặp vô hạn nếu bạn cung cấp cho nó dữ liệu xấu, nó thậm chí không kiểm tra tiêu đề PNG, vì vậy hãy cẩn thận với thư viện này! –

3

Tôi nghĩ

var myimage = new PNG('myimage.png'); 

nên

var myimage = new PNG.load('myimage.png'); 
+2

Có, tính năng này hoạt động nhưng hành động IO là đồng bộ. Tôi nghĩ cách tốt nhất là 'fs.readFile (err, data) -> image = new PNG (data)'. –

+0

@honzasp +1 yep, điểm tốt! –

Các vấn đề liên quan