Chciałbym zrobić to w sposób niezależny od platformy i wiem, że libpng to możliwość, ale ciężko mi zrozumieć, w jaki sposób. Czy ktoś wie, jak to zrobić w prosty sposób?Zapisywanie prostego bufora obrazu do png w C++
Odpowiedz
Istnieje opakowanie C++ dla libpng
o nazwie Png++
. Sprawdź to here lub po prostu google.
Mają prawdziwy interfejs C++ z szablonami i takie, które używają pod maską libpng
. Znalazłem kod, który napisałem dość ekspresywnie i na wysokim poziomie.
Przykład „generator”, który stanowi centrum algorytmu:
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
i wykorzystywany jest w następujący sposób:
std::ostream& Png::write(std::ostream& out)
{
PngGenerator aPng(_picture);
aPng.write(out);
return out;
}
Było kilka bitów nadal brakujące z libpng
(opcji przeplatania i np), ale szczerze mówiąc nie korzystałem z nich, więc było to w porządku dla mnie.
To jest piękne! Dziękuję Ci! – henle
Nie uważam tego za piękne. Jak można to uznać za piękne? Czy ktokolwiek wierzy, że jest to właściwy sposób reprezentowania obrazu? Przepraszam, że używam takiego podżegającego języka, ale nic w programowaniu mnie nie frustruje do tego stopnia, że przetwarza obrazy PNG. Dlaczego sprawić, by było bardziej skomplikowane, niż ma być? –
Powiedziałbym, że libpng jest nadal najprostszym sposobem. Jest example read -> process -> write png program, jest dość prosta, gdy usuniesz elementy obsługi błędów (setjmp/longjmp/png_jmpbuf). To nie jest prostsze.
Tak, widziałem to. Muszę przyznać, że byłem zdezorientowany, ale teraz, gdy TY mÓWISZ, że to jest proste, to naprawdę jest;) – henle
- 1. Zapisywanie duży obraz do PNG
- 2. Zapisywanie Xlib XImage do PNG
- 3. Skopiuj określoną część obrazu bufora do innego bufora obrazu
- 4. Zapisywanie metadanych do jpg i png
- 5. Zapisywanie obrazu do pliku
- 6. przekonwertować uiview do .png obrazu
- 7. Włóż kawałek tekstu do obrazu PNG
- 8. Django - Zapisywanie obrazu ręcznie do pola ImageField
- 9. Udostępnianie obrazu png w folderze do rysowania
- 10. Zapisywanie obrazu PHP Po pomyślnym przetworzeniu obrazu:
- 11. Zapisywanie obrazu za pomocą mangusty
- 12. Zapisywanie obrazu w OpenCV
- 13. Jak przekonwertować ciąg Base64 obrazu PNG do formatu PNG w C#
- 14. Zapisywanie wykresu flotowego jako obrazu
- 15. tworzenie obrazu w php, wyświetlacz działa, zapisywanie do pliku nie
- 16. Zapisywanie pliku CGImageRef w pliku PNG?
- 17. zapisywanie obrazu QML
- 18. Golang - Zamień kanały PNG obrazu przy użyciu obrazu i obrazu/PNG
- 19. Zapisywanie formularza obrazu Schowek
- 20. Konwersja bufora PNG na JPG w graphicsmagick w węźle
- 21. Zapisywanie do wykonania obrazu procesu na Linuksie
- 22. Zapisywanie bitmapy jako PNG na WP7
- 23. C#: Zapisywanie JPG w częściach
- 24. Zapisywanie obrazu lokalnie w Codename jeden projekt
- 25. Wyświetlanie obrazu .png w oknie wxPython
- 26. Konwersja obrazu JPG/GIF do PNG w PHP?
- 27. Zapisywanie obrazu na rdzeń Data
- 28. opencv odczytanie obrazu jpeg z bufora
- 29. Zapisywanie i ładowanie obrazu do IsolatedStorage Wymaga zapisywania dwukrotnie
- 30. Chcę mieć widok obrazu wewnątrz prostego adaptera?
Możesz użyć [Imagemagick] (http://www.imagemagick.org/script/index.php), ale robi to również kilka innych rzeczy. –