2004.10.21 18:37 "[Tiff] Read and modify an image", by Elzumba Sefue

Hello, I have a little problem (little?)... I get an exception of "unknow software exception"... The code is below, I try to read an compressed tiff and simply copy them in other place (for test)... but I have problems with some tags, and I fix it in a "bestial" mode (puting some tags manually). The error is when I try to "TIFFWriteEncodedStrip". I try (before) with scanlines, but I'm received the notice that isn't util for compressed images. If somebody know to fix the problem or other form to do this, I will very happy, thanks. I need exactly read an image until a black point has founded, and from this place, create a new image (this is that want the code below), but I'm happy if somebody give me an example to read and write an image using encoded strips.

PD: Sorry for the strings of the code are in spanish, but isn't important.

int FuncReadWrite(char *strFileName) {
    TIFF *tif;
    TIFF *tifout;
    unsigned long nbps,compresion,photo,pc,ru;
    char flag=0;
    tsize_t stripSize;
    unsigned long result;
    int stripMax, stripCount, cStrip, desdeStrip=0, desdeByte=0, i, NewByte=0;
    char **buffer;
    char **NewImg;
    unsigned long bufferSize, count, count2;
    uint32 width, bloque;

    printf("\nBP1");
    if ((tif = TIFFOpen(strFileName, "r")) == NULL) {
        fprintf(stderr, "No se pudo abrir %s como un archivo TIFF\n", strFileName);
        exit(0);
    }
    printf("\nBP2");
    if ((tifout = TIFFOpen("C:\\2.tif", "w")) == NULL)
{
        fprintf(stderr, "No se pudo abrir ni crear %s como un archivo TIFF\n", strFileName);
        exit(0);
    }
    printf("\nBP3");

    TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &nbps);
    TIFFGetField(tif, TIFFTAG_COMPRESSION, &compresion);
    TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photo);
    TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &pc);
    TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &ru);

    if(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width) == 0){
        fprintf(stderr, "Image does not define its width\n");
        exit(42);
    }

    /*TIFFSetField(tifout, TIFFTAG_BITSPERSAMPLE, nbps);
    TIFFSetField(tifout, TIFFTAG_COMPRESSION, compresion);
    TIFFSetField(tifout, TIFFTAG_PHOTOMETRIC, photo);
    TIFFSetField(tifout, TIFFTAG_RESOLUTIONUNIT, ru);*/

    stripSize = TIFFStripSize (tif);
    stripMax = TIFFNumberOfStrips (tif);

    buffer = (char **) malloc(stripMax);
    for(i=0;i<stripMax;i++) {
        if((buffer[i]= (char *) malloc(stripSize)) == NULL) {
          printf("\nNo alcanza la memoria (malloc).");
          exit(42);
        }
    }
    for (stripCount = 0; stripCount < stripMax; stripCount++){
        if((result = TIFFReadEncodedStrip (tif, stripCount, buffer[stripCount], stripSize)) == -1){
          printf("\nError leyendo el strip (tira) Nº %d\nIMPORTANTE: LA IMAGEN PUDO HABERSE DEFORMADO.", stripCount);
          exit(42);
        }
        //I search the black point (I'm not very sure that is correct)
        if(!flag) {
            for(cStrip=0;cStrip<stripSize;cStrip++) {
              if(buffer[stripCount][cStrip]==0x000000) {
                desdeStrip=stripMax - stripCount;
                desdeByte=stripSize - cStrip;
                bloque=width-desdeByte;
                flag=1;
              }
            }
        }
    }

    //free space for the new image
    NewImg = (char **) malloc(stripMax);
    for(i=0;i<stripMax;i++) {
        if((NewImg[i]= (char *) malloc(stripSize)) == NULL) {
          printf("\nNo alcanza la memoria (malloc).");
          exit(42);
        }
    }

    //Create new image in memory
    for (stripCount = 0; stripCount < stripMax; stripCount++){
        //Si todavia no se encontro, busco el primer punto negro
        for(cStrip=0;cStrip<stripSize;cStrip++) {
          if(cStrip>desdeByte)
              NewImg[stripCount][NewByte]=buffer[stripCount][cStrip];
          if(cStrip!=0 && (cStrip%width==0)) {
              cStrip+=desdeByte;
          }
          NewByte++;
        }
    }

    //width and PLANNAR CONF
    TIFFSetField(tifout, TIFFTAG_IMAGEWIDTH, stripSize);
    TIFFSetField(tifout, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);

    for (stripCount=0;stripCount<stripMax;stripCount++) {
        if(TIFFWriteEncodedStrip(tifout,1,buffer[stripCount],stripSize)==-1)
        printf("\nError en escritura del Strip Nº %d",bloque);
    }
    for(i=0;i<stripMax;i++) {
        free(buffer[i]);
    }
    for(i=0;i<stripMax;i++) {
        free(NewImg[i]);
    }
    free(buffer);
    free(NewImg);
    TIFFClose(tif);
    TIFFClose(tifout);
}