2008.11.26 09:37 "[Tiff] Help write 16bites grey level image", by Cristian Perca

2008.11.26 10:26 "Re: [Tiff] Help write 16bites grey level image", by Reinhard Mayr aka Czerwinski

Cristian,

I can offer you a method that worked for me. I used a .NET wrapper, but the calls are exactly the same as in C.

hth & cheers,

Reinhard.

------
                private void tbCreateTIFF_Click(object sender, System.EventArgs e)
                {
                        if (sfdCreateTIFF.ShowDialog() != DialogResult.OK) return;

DateTime startTime = DateTime.Now;

// image size
int width = 1024*Convert.ToInt16(tbSizeFactorX.Text);
int height = 1024*Convert.ToInt16(tbSizeFactorY.Text);
short rowsPerStrip = (short)height;

                        // create file
                        IntPtr newTiff = LibTIFF.Open(sfdCreateTIFF.FileName,"w");
                        IntPtr pBuffer;

if (chkSaveStrips.Checked) rowsPerStrip = Convert.ToInt16(tbSaveRowsPerStrip.Text);

// set required tag. WATCH THE TYPES!!!

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_IMAGEWIDTH,(short)width);

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_IMAGELENGTH,(short)height);

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_BITSPERSAMPLE,(int)16);

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_SAMPLESPERPIXEL,(short)1);

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_ROWSPERSTRIP,(short)rowsPerStrip);

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_PHOTOMETRIC,(short)TIFFTags.PHOTOMETRIC_MINISBLACK);

LibTIFF.SetField(newTiff,(int)TIFFTags.TIFFTAG_PLANARCONFIG,(short)TIFFTags.PLANARCONFIG_CONTIG);

if (chkSaveStrips.Checked) {
        // write strips
        pBuffer = LibTIFF._malloc(width*2*rowsPerStrip);

// assume raw data to be provided as short[]
short[] shortbits = new short[width*rowsPerStrip];

// strips
int strips = height/rowsPerStrip;
for (int strip = 0; strip < strips; strip++)
{
        for (int y = 0; y < rowsPerStrip; y++)
        {
                // pixels in line: set to specific gray value
                for (int x=0; x < width; x++)
                {
                        // short = -32,768 to 32,767 = signed 16-bit integer
                        // ushort is not supported by Marshal.Copy
                        shortbits[y*width+x] = (short) (10 * y);
                }
        }
        // copy data to unsafe context
        Marshal.Copy(shortbits,0,pBuffer,width*rowsPerStrip);
        //... and write to file
        int ret = LibTIFF.WriteRawStrip(newTiff,(uint)strip,pBuffer,width*2*rowsPerStrip);
        if (ret == -1)
                Console.WriteLine("writing strip " + strip + " returned " + ret);
}

}
else
{
        // write scanline by scanline

                                pBuffer = LibTIFF._malloc(width*2);     // 16 bpp

// assume raw data to be provided as short[]
short[] shortbits = new short[width];

        // lines
        for (int y = 0; y < height; y++)
        {
                // pixels in line: set to specific gray value
                for (int x=0; x < width; x++)
                {
                        // short = -32,768 to 32,767 = signed 16-bit integer
                        // ushort is not supported by Marshal.Copy
                        shortbits[x] = (short) (100 * y);
                }
                // copy data to unsafe context
                Marshal.Copy(shortbits,0,pBuffer,width);
                //... and write to file
                if (!LibTIFF.WriteScanline(newTiff,pBuffer,(uint)y))
                {
                        Console.WriteLine("writing line " + y + " failed.");
                }
        }
}

                        LibTIFF._free(pBuffer);
                        LibTIFF.Close(newTiff);
                        MessageBox.Show("Time: " + (DateTime.Now - startTime));
                }
-----

-------- Original-Nachricht --------
> Datum: Wed, 26 Nov 2008 01:37:27 -0800 (PST)
> Von: Cristian Perca <cristianperca@yahoo.com>
> An: tiff@lists.maptools.org
> Betreff: [Tiff] Help write 16bites grey level image

  Hi,
I have a problem while trying to write a 16 bites grey level TIFF image. Here is a part of the code. The compilation and the execution are OK but the image I get has the expected size but all pixels are black.
If someone has any idea I would really appreciated.
Thank you

    char *flatBuffer=NULL;
    TIFF *flatTiff=NULL;

flatBuffer=malloc(bufferSize);

/*test: fill the image with average of input images in imageArray*/
   //imageArray is an dynamical array of struct, each object contains an image
//All images are correctly read and object buffers filled
for (count = 0; count < bufferSize; count +=2) {
    uint32 sumPixel=0;
    for(i=0; i<noFiles; i++) {
                  //noFiles is the number of input images == number of created objects

            sumPixel += (*(uint16 *)((imageArray+i) -> buffer + count));

  }

        *(uint16 *)(flatBuffer+count) = (uint16)sumPixel/noFiles;

}

 if((flatTiff = TIFFOpen("flat.tiff", "w")) == NULL){
   fprintf(stderr, "Could not open flat.tif for writing\n");
   exit(42);
}

TIFFSetField(flatTiff, TIFFTAG_IMAGEWIDTH, width);

TIFFSetField(flatTiff, TIFFTAG_IMAGELENGTH, height);

TIFFSetField(flatTiff, TIFFTAG_COMPRESSION, COMPRESSION_NONE);

TIFFSetField(flatTiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);

TIFFSetField(flatTiff, TIFFTAG_BITSPERSAMPLE, bps); //bps=16

TIFFSetField(flatTiff, TIFFTAG_SAMPLESPERPIXEL, spp); //spp=1

TIFFSetField(flatTiff, TIFFTAG_ROWSPERSTRIP, height); // put all rows(==height no of rows) in one strip

TIFFSetField(flatTiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);

TIFFSetField(flatTiff, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);

    if( i=TIFFWriteEncodedStrip(flatTiff, 0, flatBuffer, bufferSize) == -1) {
        fprintf(stderr, "Error while writing image to file!");
        exit(42);
    }
//the image has only black pixels, but if I print flatBuffer on the screen I get the expected values:

//printf("%d %d\n", *(uint16 *)(flatBuffer+0), *(uint16 *)(flatBuffer+2));

    TIFFClose(flatTiff);
}

--
Sensationsangebot nur bis 30.11: GMX FreeDSL - Telefonanschluss + DSL
für nur 16,37 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a