2010-02-18 29 views
5

Tôi muốn làm điều này theo cách độc lập trên nền tảng, và tôi biết libpng là một khả năng, nhưng tôi thấy khó để tìm ra cách. Có ai biết làm thế nào để làm điều này một cách đơn giản?Lưu một bộ đệm hình ảnh đơn giản vào png trong C++

+0

Bạn có thể sử dụng [Imagemagick] (http://www.imagemagick.org/script/index.php) nhưng cũng có một số thứ khác. –

Trả lời

5

Có trình bao bọc C++ cho libpng được gọi là Png++. Kiểm tra xem nó here hoặc chỉ cần google nó.

Chúng có giao diện C++ thực với mẫu và ví dụ như sử dụng libpng bên dưới nắp. Tôi đã tìm thấy mã tôi đã viết khá biểu cảm và cao cấp.

Ví dụ về "máy phát điện", mà là trái tim của thuật toán:

class PngGenerator : public png::generator< png::gray_pixel_1, PngGenerator> 
{ 
    typedef png::generator< png::gray_pixel_1, PngGenerator> base_t; 
public: 
    typedef std::vector<char> line_t; 
    typedef std::vector<line_t> picture_t; 

    PngGenerator(const picture_t& iPicture) : 
    base_t(iPicture.front().size(), iPicture.size()), 
    _picture(iPicture), _row(iPicture.front().size()) 
    { 
    } // PngGenerator 

    png::byte* get_next_row(size_t pos) 
    { 
    const line_t& aLine = _picture[pos]; 

    for(size_t i(0), max(aLine.size()); i < max; ++i) 
     _row[i] = pixel_t(aLine[i] == Png::White_256); 
     // Pixel value can be either 0 or 1 
     // 0: Black, 1: White 

    return row_traits::get_data(_row); 
    } // get_next_row 

private: 
    // To be transformed 
    const picture_t& _picture; 

    // Into 
    typedef png::gray_pixel_1 pixel_t; 
    typedef png::packed_pixel_row<pixel_t> row_t; 
    typedef png::row_traits<row_t> row_traits; 
    row_t _row; // Buffer 
}; // class PngGenerator 

Và sử dụng là như thế này:

std::ostream& Png::write(std::ostream& out) 
{ 
    PngGenerator aPng(_picture); 
    aPng.write(out); 
    return out; 
} 

Đã có một số bit vẫn còn thiếu từ libpng (tùy chọn đan xen và như vậy), nhưng thẳng thắn tôi không sử dụng chúng nên tôi không sao cả.

+0

Đó là đẹp! Cảm ơn bạn! – henle

+7

Tôi không thấy điều này thật đẹp. Làm thế nào điều này có thể được coi là đẹp? Có ai thực sự tin rằng đây là một cách thích hợp để đại diện cho một hình ảnh? Xin lỗi vì sử dụng ngôn ngữ như vậy, nhưng không có gì trong lập trình đã làm tôi thất vọng đến mức xử lý hình ảnh PNG. Tại sao làm cho nó phức tạp hơn nó phải được? –

1

Tôi muốn nói libpng vẫn là cách dễ nhất. Có example read -> process -> write png program, nó khá đơn giản khi bạn xử lý lỗi (setjmp/longjmp/png_jmpbuf). Nó không đơn giản hơn thế.

+1

Vâng, tôi đã thấy điều đó. Tôi phải nói, tôi đã nhầm lẫn, nhưng bây giờ bạn nói với tôi rằng nó đơn giản, nó thực sự là;) – henle

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