Есть проблема. У меня есть изображение TIFF (которые имеют 4 слоя).
Моя задача — сделать небольшие изменения цвета пикселя, чтобы сделать изображение лучше.
В этом случае я использую библиотеку GDAL. Мой источник:
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen(fileName.toStdString().c_str(), GA_ReadOnly);
if (poDataset == NULL) {
QMessageBox::information(0, "error", "We have problems");
} else {
QMessageBox::information(0, "Message", "All is ok");
}
int rasterCount = poDataset->GetRasterCount(); // Here is 4 raster images
GDALRasterBand *band = poDataset->GetRasterBand(1);
int width = band->GetXSize();
int height = band->GetYSize();for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
// cross all pixels
// How to get pixel color here?
}
}
Так что я не знаю, как получить цвет пикселя в цикле. Можете ли вы дать мне совет pleasae?
У меня нет примеров в GDAL API, но я сделал в библиотеке Python. Вы можете сделать то же самое, следуя аналогичной логике, передав значение изображения в массив и пройдя по нему, применяя к нему некоторые условные изменения.
import numpy as np
from osgeo import gdal
ds = gdal.Open("test.tif")
myarray = np.array(ds.GetRasterBand(1).ReadAsArray())
...
Для начала вам нужно знать тип данных:
GDALDataType dataType=band->GetRasterDataType();
Это даст вам число, которое определяется как:
typedef enum {
/*! Unknown or unspecified type */ GDT_Unknown = 0,
/*! Eight bit unsigned integer */ GDT_Byte = 1,
/*! Sixteen bit unsigned integer */ GDT_UInt16 = 2,
/*! Sixteen bit signed integer */ GDT_Int16 = 3,
/*! Thirty two bit unsigned integer */ GDT_UInt32 = 4,
/*! Thirty two bit signed integer */ GDT_Int32 = 5,
/*! Thirty two bit floating point */ GDT_Float32 = 6,
/*! Sixty four bit floating point */ GDT_Float64 = 7,
/*! Complex Int16 */ GDT_CInt16 = 8,
/*! Complex Int32 */ GDT_CInt32 = 9,
/*! Complex Float32 */ GDT_CFloat32 = 10,
/*! Complex Float64 */ GDT_CFloat64 = 11,
GDT_TypeCount = 12 /* maximum type # + 1 */
} GDALDataType;
Таким образом, если ваш GDALDataType равен 6, тогда ваш тип данных является плавающим, поэтому вы можете прочитать значение в пикселях следующим образом:
float value=0;
band->RasterIO(GF_Read,i,j,1,1,&value,1,1,band->GetRasterDataType(),1,1,nullptr);
std::cout << "value = " << value << std::endl;