Пример #1
0
NITF_BOOL makeImageSource(imgInfo *img, nitf_Writer *writer, nitf_Error *error)
{
    nitf_ImageSource *source;     /* Image source for image writer */
    nitf_BandSource *bandSource;  /* Current band source */
    int i;

    img->imgWriter = nitf_Writer_newImageWriter(writer, img->index, error);
    source = nitf_ImageSource_construct(error);
    if (source == NULL)
        return(NITF_FAILURE);

    for (i = 0;i < img->nBands;i++)
    {
        bandSource = nitf_MemorySource_construct((char *) (img->buffers[i]),
                     img->imgSize, (nitf_Off) 0, 0, 0, error);
        if (!bandSource)
            return(NITF_FAILURE);

        if (!nitf_ImageSource_addBand(source, bandSource, error))
            return(NITF_FAILURE);
    }

    img->imgSource = source;

    if (!nitf_ImageWriter_attachSource(img->imgWriter, source, error))
        return(NITF_FAILURE);

    nitf_ImageIO_setPadPixel(img->imgWriter->imageBlocker,
                             img->padValue, img->bytes);

    return(NITF_SUCCESS);
}
Пример #2
0
int main(int argc, char *argv[])
{
    nitf_ImageIO *nitf;                     /* The parent nitf_ImageIO object */
    char errorBuf[NITF_MAX_EMESSAGE];       /* Error buffer */
    nitf_Uint8 **user;                      /* User buffer list */
    int padded;                             /* Pad pixel present flag */
    nitf_IOHandle fileHandle;               /* I/O handle for reads */
    int ofd;                                /* File descriptor for writes */
    FILE *vector;                           /* FILE for reading vectors */
    test_nitf_ImageIOConstructArgs *newArgs;/* Arguments for new */
    test_nitf_ImageIOReadArgs *readArgs;    /* Arguments for read */
    nitf_ImageSubheader *subheader;         /* For constructor */
    size_t subWindowSize;                   /* Sub-window pixel count */
    nitf_SubWindow *subWindow;              /* Argument for read */
    nitf_DownSampler* downSampler;          /* Down-sample object */
    char *error;                            /* Error message return */
    nitf_Error errorObjActual;              /* Error object instance */
    nitf_Error *errorObj;                   /* Error object (pointer) */
    int i;

    errorObj = &errorObjActual;

    /*    Usage */

    if (argc < 2)
    {
        fprintf(stderr,
                "Usage: %s imageVector readVector band0Out band1Out ... >result\n", argv[0]);
        exit(0);
    }

    /*      Read image and read parameters from first and second arguments */

    vector = fopen(argv[1], "r");
    if (vector == NULL)
    {
        fprintf(stderr, "Error opening image vector file %s\n", argv[0]);
        exit(-1);
    }

    newArgs = test_nitf_ImageIOReadConstructArgs(vector, &error);
    if (newArgs == NULL)
    {
        fprintf(stderr, "%s\n", error);
        exit(-1);
    }
    fclose(vector);

    vector = fopen(argv[2], "r");
    if (vector == NULL)
    {
        fprintf(stderr, "Error opening read vector file %s\n", argv[0]);
        exit(-1);
    }

    readArgs = test_nitf_ImageIOReadReadArgs(vector, &error);
    if (readArgs == NULL)
    {
        fprintf(stderr, "%s\n", error);
        exit(-1);
    }
    fclose(vector);

    /*      Allocate user buffers */

    subWindowSize = (readArgs->nRows) * (readArgs->nColumns) * (newArgs->nBits / 8);

    user = (nitf_Uint8 **) malloc(sizeof(nitf_Uint8 *) * (readArgs->nBands));
    if (user == NULL)
    {
        fprintf(stderr, "Error allocating user buffer\n");
        exit(-1);
    }

    for (i = 0;i < readArgs->nBands;i++)
    {
        user[i] = (nitf_Uint8 *) malloc(subWindowSize);
        if (user[i] == NULL)
        {
            fprintf(stderr, "Error allocating user buffer\n");
            exit(-1);
        }
    }

    /*    Create a fake image subheader to give to ImageIO constructor */

    subheader = test_nitf_ImageIO_fakeSubheader(newArgs, &error);
    if (subheader == NULL)
    {
        fprintf(stderr, "%s", error);
        exit(-1);
    }

    /*     Create the ImageIO */

    nitf = nitf_ImageIO_construct(subheader, newArgs->offset,
                                  0,/*length, must be correct for decompression */
                                  NULL, NULL, errorObj);
    if (nitf == NULL)
    {
        fprintf(stderr, "NtfBlk new failed: %s\n", errorBuf);
        fprintf(stderr, "Err: %s\n", errorObj->message);
        exit(0);
    }

    nitf_ImageIO_setPadPixel(nitf, newArgs->padValue,
                             NITF_NBPP_TO_BYTES(newArgs->nBits));

    nitf_ImageIO_print(nitf, stdout);

    /*     Open input file */

    fileHandle = nitf_IOHandle_create(readArgs->name,
                                      NITF_ACCESS_READONLY, 0, errorObj);
    if (NITF_INVALID_HANDLE(fileHandle))
    {
        nitf_Error_init(errorObj, "File open failed",
                        NITF_CTXT, NITF_ERR_OPENING_FILE);
        nitf_Error_print(errorObj, stderr, "File open failed");
        exit(0);
    }

    /*    Setup for read (create and initialize sub-window object */

    if ((subWindow = nitf_SubWindow_construct(errorObj)) == NULL)
    {
        nitf_Error_init(errorObj, "Sub-window object construct failed",
                        NITF_CTXT, NITF_ERR_INVALID_OBJECT);
        nitf_Error_print(errorObj, stderr, "Sub-window object construct failed");
        nitf_IOHandle_close(fileHandle);
        nitf_ImageIO_destruct(&nitf);
        exit(0);
    }

    subWindow->startRow = readArgs->row;
    subWindow->numRows = readArgs->nRows;
    subWindow->startCol = readArgs->column;
    subWindow->numCols = readArgs->nColumns;
    subWindow->bandList = readArgs->bands;
    subWindow->numBands = readArgs->nBands;

    if ((readArgs->rowSkip != 1) || (readArgs->columnSkip != 1))
    {
        if (strcmp(readArgs->downSample, "pixelSkip") == 0)
        {
            if ((downSampler = nitf_PixelSkip_construct(
                                   readArgs->rowSkip, readArgs->columnSkip, errorObj)) == NULL)
            {
                nitf_Error_init(errorObj, "Down-sampler object construct failed",
                                NITF_CTXT, NITF_ERR_INVALID_OBJECT);
                nitf_Error_print(errorObj, stderr,
                                 "Down-sampler object construct failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                exit(0);
            }

            if (nitf_SubWindow_setDownSampler(
                        subWindow, downSampler, errorObj) == NITF_FAILURE)
            {
                nitf_Error_init(errorObj, "Read failed",
                                NITF_CTXT, NITF_ERR_READING_FROM_FILE);
                nitf_Error_print(errorObj, stderr, "Read failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                nitf_DownSampler_destruct(&downSampler);
                exit(0);
            }
        }
        else if (strcmp(readArgs->downSample, "max") == 0)
        {

            if ((downSampler = nitf_MaxDownSample_construct(
                                   readArgs->rowSkip, readArgs->columnSkip, errorObj)) == NULL)
            {
                nitf_Error_init(errorObj, "Down-sampler object construct failed",
                                NITF_CTXT, NITF_ERR_INVALID_OBJECT);
                nitf_Error_print(errorObj, stderr,
                                 "Down-sampler object construct failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                exit(0);
            }

            if (nitf_SubWindow_setDownSampler(
                        subWindow, downSampler, errorObj) == NITF_FAILURE)
            {
                nitf_Error_init(errorObj, "Read failed",
                                NITF_CTXT, NITF_ERR_READING_FROM_FILE);
                nitf_Error_print(errorObj, stderr, "Read failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                nitf_DownSampler_destruct(&downSampler);
                exit(0);
            }
        }
        else if (strcmp(readArgs->downSample, "sumSq2") == 0)
        {

            if ((downSampler = nitf_SumSq2DownSample_construct(
                                   readArgs->rowSkip, readArgs->columnSkip, errorObj)) == NULL)
            {
                nitf_Error_init(errorObj, "Down-sampler object construct failed",
                                NITF_CTXT, NITF_ERR_INVALID_OBJECT);
                nitf_Error_print(errorObj, stderr,
                                 "Down-sampler object construct failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                exit(0);
            }

            if (nitf_SubWindow_setDownSampler(
                        subWindow, downSampler, errorObj) == NITF_FAILURE)
            {
                nitf_Error_init(errorObj, "Read failed",
                                NITF_CTXT, NITF_ERR_READING_FROM_FILE);
                nitf_Error_print(errorObj, stderr, "Read failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                nitf_DownSampler_destruct(&downSampler);
                exit(0);
            }
        }
        else if (strcmp(readArgs->downSample, "select2") == 0)
        {

            if ((downSampler = nitf_Select2DownSample_construct(
                                   readArgs->rowSkip, readArgs->columnSkip, errorObj)) == NULL)
            {
                nitf_Error_init(errorObj, "Down-sampler object construct failed",
                                NITF_CTXT, NITF_ERR_INVALID_OBJECT);
                nitf_Error_print(errorObj, stderr,
                                 "Down-sampler object construct failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                exit(0);
            }

            if (nitf_SubWindow_setDownSampler(
                        subWindow, downSampler, errorObj) == NITF_FAILURE)
            {
                nitf_Error_init(errorObj, "Read failed",
                                NITF_CTXT, NITF_ERR_READING_FROM_FILE);
                nitf_Error_print(errorObj, stderr, "Read failed");
                nitf_IOHandle_close(fileHandle);
                nitf_ImageIO_destruct(&nitf);
                nitf_SubWindow_destruct(&subWindow);
                nitf_DownSampler_destruct(&downSampler);
                exit(0);
            }
        }
        else
        {
            nitf_Error_init(errorObj, "Invalid down-sample method",
                            NITF_CTXT, NITF_ERR_INVALID_PARAMETER);
            nitf_Error_fprintf(errorObj, stderr,
                               "Invalid down-sample method: %s\n", readArgs->downSample);
            nitf_IOHandle_close(fileHandle);
            nitf_ImageIO_destruct(&nitf);
            nitf_SubWindow_destruct(&subWindow);
            exit(0);
        }
    }

    /*     Read sub-window */

    if (!nitf_ImageIO_read(nitf, fileHandle, subWindow, user, &padded, errorObj))
    {
        nitf_Error_print(errorObj, stderr, "Read failed");
        nitf_IOHandle_close(fileHandle);
        nitf_ImageIO_destruct(&nitf);
        nitf_SubWindow_destruct(&subWindow);
        exit(0);
    }
    nitf_SubWindow_destruct(&subWindow);

    nitf_IOHandle_close(fileHandle);

    printf("Padded = %d\n", padded);

    /*      Write result */

    for (i = 0;i < readArgs->nBands;i++)
    {
        if ((ofd = open(argv[3+i], O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1)
        {
            fprintf(stderr, "Output file %d open failed\n", i);
            exit(0);
        }

        write(ofd, user[i], subWindowSize);
        close(ofd);
    }

    return 0;
}
Пример #3
0
int main(int argc, char *argv[])
{
    FILE *vector;                    /* File stream for input vector */
    /* Arguments for new */
    test_nitf_ImageIOConstructArgs *newArgs;
    /* Arguments for read */
    test_nitf_ImageIOReadArgs *readArgs;
    char *errorStr;                  /* Error string */

    nitf_ImageSubheader *subheader;   /* Subheader for ImageIO constructor */
    nitf_IOHandle io;                /* Handle for output */
    nitf_Error error;                /* Error object */
    nitf_ImageIO *image;             /* ImageIO for image */
    nitf_Uint8 *user[NUM_BANDS_MAX]; /* User buffer for write rows */
    nitf_Uint8 ***data;              /* Generated data [band][row][col] */
    nitf_Uint32 band;                /* Current band */
    nitf_Uint32 row;                 /* Current row */
    nitf_Uint32 col;                 /* Current  column*/

    if (argc < 3)
    {
        fprintf(stderr, "Not enough arguments\n");
        exit(-1);
    }

    vector = fopen(argv[1], "r");
    if (vector == NULL)
    {
        fprintf(stderr, "Error opening vector file %s\n", argv[1]);
        exit(-1);
    }

    newArgs = test_nitf_ImageIOReadConstructArgs(vector, &errorStr);
    if (newArgs == NULL)
    {
        fprintf(stderr, "%s\n", errorStr);
        return(-1);
    }

    fclose(vector);

    /*    Create a fake image subheader to give to ImageIO constructor */

    subheader = test_nitf_ImageIO_fakeSubheader(newArgs, &errorStr);
    if (subheader == NULL)
    {
        fprintf(stderr, "%s", error);
        return(-1);
    }

    /*      Create Image */

    if (strcmp(newArgs->dataPattern, "brcI4") == 0)
    {
        data = (nitf_Uint8 ***) test_nitf_ImageIO_brcI4(newArgs, &errorStr);
        if (data == NULL)
        {
            fprintf(stderr, "%s\n", errorStr);
            exit(-1);
        }
    }
    else if (strcmp(newArgs->dataPattern, "brcC8") == 0)
    {
        data = (nitf_Uint8 ***) test_nitf_ImageIO_brcC8(newArgs, &errorStr);
        if (data == NULL)
        {
            fprintf(stderr, "%s\n", errorStr);
            exit(-1);
        }
    }
    else
    {
        fprintf(stderr, "Invalid pattern method %s\n");
        exit(-1);
    }

    /*      Create output file */

    io = nitf_IOHandle_create(argv[2],
                              NITF_ACCESS_WRITEONLY, NITF_CREATE | NITF_TRUNCATE, &error);
    if (NITF_INVALID_HANDLE(io))
    {
        nitf_Error_print(&error, stderr, "Error creating output file");
        exit(1);
    }

    /* Create the ImageIO structure */

    /*               What about segment length in write ?? */

    image = nitf_ImageIO_construct(subheader, 0, 0, NULL, NULL, &error);
    if (image == NULL)
    {
        nitf_Error_print(&error, stderr, "Error creating ImageIO");
        exit(1);
    }

    /* Setup for write */

    nitf_ImageIO_setPadPixel(image, newArgs->padValue,
                             NITF_NBPP_TO_BYTES(newArgs->nBits));

    if (nitf_ImageIO_writeSequential(image, io, &error) == 0)
    {
        nitf_Error_print(&error, stderr, "Error creating ImageIO");
        exit(1);
    }

    /* Write rows */

    for (row = 0;row < newArgs->nRows;row++)
    {
        for (band = 0;band < newArgs->nBands;band++)
            user[band] = (nitf_Uint8 *) & (data[band][row][0]);
        if (!nitf_ImageIO_writeRows(image, io, 1, user, &error))
        {
            nitf_Error_print(&error, stderr, "Writing rows");
            exit(1);
        }
    }

    if (!nitf_ImageIO_writeDone(image, io, &error))
    {
        nitf_Error_print(&error, stderr, "Writing rows");
        exit(1);
    }

    /* Destroy things */

    test_nitf_ImageIO_freeArray(data);
    nitf_ImageIO_destruct(&image);
    nitf_IOHandle_close(io);
    exit(0);
}