Als Nils zeigte, gibt es so etwas wie ein C oder C++ Standardbibliothek für die JPEG-Kompression und Bildmanipulation nicht.
Falls Sie in der Lage sind, eine Bibliothek eines Drittanbieters zu verwenden, können Sie versuchen, GDAL, die JPEG, PNG und Dutzende von anderen Formaten, Komprimierungen und Medien unterstützt.
ist hier einfaches Beispiel, das zeigt, wie Pixeldaten von JPEG-Datei mit GDAL C++ API zu lesen:
#include <gdal_priv.h>
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
int main()
{
GDALAllRegister(); // once per application
// Assume 3-band image with 8-bit per pixel per channel (24-bit depth)
std::string const file("/home/mloskot/test.jpg");
// Open file with image data
GDALDataset* ds = static_cast<GDALDataset*>(GDALOpen(file.c_str(), GA_ReadOnly));
assert(0 != ds);
// Example 1 - Read multiple bands at once, assume 8-bit depth per band
{
int const ncols = ds->GetRasterXSize();
int const nrows = ds->GetRasterYSize();
int const nbands = ds->GetRasterCount();
int const nbpp = GDALGetDataTypeSize(GDT_Byte)/8;
std::vector<unsigned char> data(ncols * nrows * nbands * nbpp);
CPLErr err = ds->RasterIO(GF_Read, 0, 0, ncols, nrows, &data[0], ncols, nrows, GDT_Byte, nbands, 0, 0, 0, 0);
assert(CE_None == err);
// ... use data
}
// Example 2 - Read first scanline by scanline of 1 band only, assume 8-bit depth per band
{
GDALRasterBand* band1 = ds->GetRasterBand(1);
assert(0 != band1);
int const ncols = band1->GetXSize();
int const nrows = band1->GetYSize();
int const nbpp = GDALGetDataTypeSize(GDT_Byte)/8;
std::vector<unsigned char> scanline(ncols * nbpp);
for (int i = 0; i < nrows; ++i)
{
CPLErr err = band1->RasterIO(GF_Read, 0, 0, ncols, 1, &scanline[0], ncols, 1, GDT_Byte, 0, 0);
assert(CE_None == err);
// ... use scanline
}
}
return 0;
}
Es ist vollständigere GDAL API tutorial zur Verfügung.
Wie ist es schlechte Nachrichten, dass sie in C sind? Es ist viel einfacher, C-Bibliotheken in C++ als C-Bibliotheken in Perl, Python, Java oder C# zu verwenden. Und viel einfacher als die Verwendung von C++. –
Ich musste einmal für eine Klassenzuordnung einen JPEG-Decoder in Java schreiben. Es war eine mörderische Aufgabe (und Java hat es nicht einfacher gemacht, lass mich dir das sagen), gab mir aber trotzdem eine Menge Einblick in das Format und die Huffman-Kodierung. Der Versuch, so etwas selbst zu machen, ist sicherlich ein Overkill, es sei denn, Sie haben sehr enge Speicher-/Geschwindigkeitsanforderungen, zum Beispiel beim Codieren für ein stark eingeschränktes Embedded-System. –