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++
Trả lời
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ả.
Đó là đẹp! Cảm ơn bạn! – henle
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? –
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ế.
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
- 1. Tìm bộ đệm Java đơn giản trong bộ nhớ
- 2. Lưu <svg> HTML5 vào PNG hoặc hình ảnh
- 3. Làm cách nào để mã một bộ đệm tròn số nguyên đơn giản trong C/C++?
- 4. lưu hình ảnh lớn để PNG
- 5. php GD thêm đệm vào hình ảnh
- 6. Cách đơn giản để đọc các giá trị màu pixel từ hình ảnh PNG trên iPhone?
- 7. Lưu dưới dạng hình ảnh png trong android
- 8. Kết hợp các hình ảnh png vào một hình ảnh trong WPF
- 9. Tại sao firefox không xuất hiện để lưu vào bộ nhớ đệm hình ảnh?
- 10. Cài đặt bản đồ rất đơn giản trong C (cho mục đích bộ nhớ đệm)?
- 11. Máy chủ hình ảnh đơn giản
- 12. Kết hợp hình ảnh png vào một tệp pdf
- 13. Hình ảnh nền CSS của trình duyệt có lưu vào bộ đệm không?
- 14. Chèn một đoạn văn bản vào ảnh png
- 15. Lưu hình ảnh vào bộ nhớ cục bộ phonegap
- 16. Đọc hình ảnh PNG trong Node.js
- 17. Sự cố với hình ảnh PNG trong C#
- 18. C# Lưu hình ảnh lớn
- 19. Nhiều bộ đệm logic trong một bộ đệm khung thực
- 20. Hoạt ảnh đơn giản sử dụng C#/Windows Forms
- 21. NSURLCache không lưu vào bộ nhớ đệm
- 22. Thêm một ScrollView đơn giản vào Bộ sưu tập gây rò rỉ bộ nhớ
- 23. Lưu trữ một bảng đơn giản trong bộ nhớ trong ASP.NET?
- 24. Lưu vào bộ nhớ đệm phía máy khách trong GWT
- 25. Đầu vào nối tiếp được lưu vào bộ đệm dòng
- 26. bộ hình ảnh đào tạo cho một mạng lưới thần kinh đơn giản
- 27. Thêm hình ảnh png vào hình ảnh trong thời gian chạy bằng Delphi XE
- 28. Bộ sưu tập ảnh đơn giản là đá quý
- 29. IOS vẽ một hình ảnh đơn giản hóa mờ bằng Xamarin C#
- 30. Lưu hình ảnh svg được hiển thị bằng javascript vào đĩa cục bộ dưới dạng tệp .png
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. –