[Okular-devel] [okular] [Bug 344287] Open floating point tiffs
Mikhail Kandel
kandel3 at illinois.edu
Tue Feb 17 19:45:36 UTC 2015
https://bugs.kde.org/show_bug.cgi?id=344287
--- Comment #4 from Mikhail Kandel <kandel3 at illinois.edu> ---
I read them where T=float:
static
TIFFImage<T> readBuffer(const char* fname)//deallocate with
{
TIFF* tif = TIFFOpen(fname, "r");//tiff open catch error?
assert(tif);
int imgH, imgW;
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imgH);
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imgW);
int rowsize = imgW*sizeof(T);
auto mydata = (unsigned char*)malloc(rowsize*imgH);
for (int row = 0; row < imgH; row++)
{
auto toMe = (void*)&mydata[rowsize*row];
TIFFReadScanline(tif, toMe, row);
}
TIFFClose(tif);
TIFFImage<T> s;
s.c = imgW;
s.r = imgH;
s.img = (T*)mydata;
return s;
}
write them like
static void writeTiffFast(const char* name, const void* buffer, unsigned
int w, unsigned int h, bool isfloat, bool fast=false, const TiffExtraMetaData*
meta = nullptr)
{
assert((w>0) && (h > 0));
TIFF* tif = TIFFOpen(name, "w");//quality error correcting code
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, w); // set the width of the
image
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h); // set the height of the
image
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); // set number of
channels per pixel
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField(tif, TIFFTAG_SOFTWARE, "QLI SLIM5");
TIFFSetField(tif, TIFFTAG_MAKE, "Mikhail Kandel");
if (meta!=nullptr)
{
TIFFSetField(tif, TIFFTAG_DATETIME, meta->datetime);
}
else
{
//get default meta data;
TiffExtraMetaData defaulto;
TIFFSetField(tif, TIFFTAG_DATETIME, defaulto.datetime);
}
TIFFSetField(tif, TIFFTAG_MODEL, __DATE__);
int rowsize = 0;
if (isfloat)
{
//todo write a LUT
//TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8 * sizeof(float)); //
set the size of the channels
TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); //
set number of channels per pixel
rowsize = w*sizeof(float);
}
else
{
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8 * sizeof(unsigned
short)); // set the size of the channels
TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); //
set number of channels per pixel
rowsize = w*sizeof(unsigned short);
}
if (fast)
//if (0) //todo make this work ?
{
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, h);
int bytesize = rowsize*h;
TIFFWriteRawStrip(tif, 1, (void*)buffer, bytesize);
}
else
{
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
for (unsigned int r = 0; r < h; r++)//'r' for row
{
auto aschar = (unsigned char*)buffer;
auto data = &aschar[rowsize*r];
TIFFWriteScanline(tif, data, r);
}
}
TIFFClose(tif);
}
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the Okular-devel
mailing list