Như Nils chỉ, không có những điều như một C hoặc thư viện chuẩn C++ cho nén JPEG và xử lý ảnh.
Trong trường hợp bạn có thể sử dụng thư viện của bên thứ ba, bạn có thể muốn thử GDAL hỗ trợ JPEG, PNG và hàng chục định dạng, nén và phương tiện khác.
Dưới đây là ví dụ đơn giản mà trình bày làm thế nào để đọc dữ liệu pixel từ tập tin JPEG sử dụng GDAL C++ API:
#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;
}
Có đầy đủ hơn GDAL API tutorial sẵn.
Tin xấu là chúng ở trong C bằng cách nào? Việc sử dụng các thư viện C trong C++ dễ dàng hơn nhiều so với các thư viện C trong Perl, Python, Java hoặc C#. Và dễ dàng hơn nhiều so với cố gắng sử dụng bất kỳ từ C++. –
Tôi đã từng viết một bộ giải mã JPEG trong Java để gán lớp. Đó là một nhiệm vụ giết người (và Java đã không làm cho nó dễ dàng hơn, hãy để tôi nói với bạn rằng), nhưng tuy nhiên đã cho tôi rất nhiều cái nhìn sâu sắc vào định dạng và Huffman mã hóa chính nó. Việc cố gắng làm một việc như vậy chắc chắn là quá mức cần thiết, trừ khi bạn có yêu cầu về bộ nhớ/tốc độ rất chặt chẽ, ví dụ như khi mã hóa cho một hệ thống nhúng bị hạn chế nghiêm trọng. –