簡體   English   中英

從 GDALDataSet 創建 RBG Color QImage

[英]create an RBG Color QImage from a GDALDataSet

我使用GDAL讀取一些圖像文件並希望使用Qt顯示它們。 到目前為止,我設法為我的GDALDataSet每個GDALRasterBand創建了一個灰度QImage ,但我不知道如何創建單個 RGB 圖像。

這是我所做的:

#include <gdal_priv.h>
#include <QtGui\QImage>

int main(int argc, char *argv[])
{
    GDALAllRegister();

    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_some_image.tif", GA_ReadOnly));
    int size_out = 200;

    for (int i = 1; i <= 3; ++i)
    { 
        GDALRasterBand* band = dataset->GetRasterBand(i);

        std::vector<uchar> band_data(size_out * size_out);
        band->RasterIO(GF_Read, 0, 0, size_out, size_out, band_data.data(), size_out, size_out, GDT_Byte, 0, 0);

        QImage band_image(band_data.data(), size_out, size_out, QImage::Format_Grayscale8);
        band_image.save(QString("C:\\band_%1.png").arg(i));
    }

    return 0;
}

如何讀取數據以便創建單個 RGB QImage

你快到了。 第一項是QImage使用帶有格式標志的緩沖區。 結果,該格式標志需要與從文件中加載的圖像匹配,否則需要進行轉換。 下面的示例假定一個4通道圖像。

QImage格式標志文檔: http : //doc.qt.io/qt-5/qimage.html#Format-enum

下一個組件是GDAL的RasterIO方法分別處理每個波段,這意味着您必須分別交錯像素或失去逐波段加載柵格所帶來的效率。

RasterIO: http ://gdal.org/classGDALRasterBand.html#a30786c81246455321e96d73047b8edf1

我喜歡OpenCV的merge方法。 只需為每個波段創建一個灰度圖像merge它們merge在一起。

OpenCV合並: http : //docs.opencv.org/3.0.0/d2/de8/group__core__array.html#ga61f2f2bde4a0a0154b2333ea504fab1d

例如,給定RGBA GeoTiff,

// OpenCV Libraries
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

// GDAL Libraries
#include <gdal.h>

// QT Libraries
#include <QtGui\QImage>

using namespace cv;


int main( int argc, char* argv[] )
{

    // Initialize GDAL
    GDALAllRegister();

    // Load image
    GDALDataset* dataset = GDALOpen("path_to_some_image.tif", GA_ReadOnly);

    // Get raster image size
    int rows = dataset->GetRasterYSize();
    int cols = dataset->GetRasterXSize();
    int channels = dataset->GetRasterCount();

    // Create each separate image as grayscale
    std::vector<cv::Mat> image_list(channels, cv::Mat( rows, cols, CV_8UC1 ));
    cv::Mat output_image;

    // Iterate over each channel
    for (int i = 1; i <= channels; ++i)
    { 
        // Fetch the band
        GDALRasterBand* band = dataset->GetRasterBand(i);

        // Read the data
        band->RasterIO( GF_Read, 0, 0, 
                        cols, rows, 
                        image_list[i-1].data, 
                        cols, rows, 
                        GDT_Byte, 0, 0);

    }

    // Merge images
    cv::merge( image_list, output_image );

    // Create the QImage
    QImage qt_image( band_data.data(), 
                     cols, 
                     rows,
                     QImage::Format_RGBA8888);

    // Do some stuff with the image

    return 0;
 }

沒有 OpenCV,使用 msmith81886 代碼:

// Load image
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen(tifFile.toLocal8Bit().data(), GA_ReadOnly));

    // Get raster image size
    int rows = dataset->GetRasterYSize();
    int cols = dataset->GetRasterXSize();
    int channels = dataset->GetRasterCount();

    std::vector<std::vector<uchar>> bandData(channels);
    for (auto& mat : bandData)
    {
        mat.resize(size_t(rows * cols));
    }
    std::vector<uchar> outputImage(size_t(4 * rows * cols));

    // Iterate over each channel
    for (int i = 1; i <= channels; ++i)
    {
        // Fetch the band
        GDALRasterBand* band = dataset->GetRasterBand(i);

        // Read the data
        band->RasterIO(GF_Read, 0, 0, cols, rows, bandData[size_t(i - 1)].data(),
            cols, rows, GDT_Byte, 0, 0);        
    }

    for (size_t i = 0, j = 0; i < outputImage.size(); i += 4, j += 1)
    {
        outputImage[i] = bandData[0][j];
        outputImage[i + 1] = bandData[1][j];
        outputImage[i + 2] = bandData[2][j];
        outputImage[i + 3] = bandData[3][j];
    }

    // Create the QImage (or even a QPixmap suitable for displaying teh image
    QImage qtImage(outputImage.data(), cols, rows, QImage::Format_RGBA8888);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM