Comments (4)
I tried figuring out how libtiff does this, but this is the only relevant code I found:
/*
* Construct a mapping table to convert from the range
* of the data samples to [0,255] --for display. This
* process also handles inverting B&W images when needed.
*/
static int
setupMap(TIFFRGBAImage* img)
{
int32_t x, range;
range = (int32_t)((1L << img->bitspersample) - 1);
/* treat 16 bit the same as eight bit */
if (img->bitspersample == 16)
range = (int32_t)255;
img->Map = (TIFFRGBValue*)_TIFFmalloc((range + 1) * sizeof(TIFFRGBValue));
if (img->Map == NULL) {
TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif),
"No space for photometric conversion table");
return (0);
}
if (img->photometric == PHOTOMETRIC_MINISWHITE) {
for (x = 0; x <= range; x++)
img->Map[x] = (TIFFRGBValue)(((range - x) * 255) / range);
} else {
for (x = 0; x <= range; x++)
img->Map[x] = (TIFFRGBValue)((x * 255) / range);
}
if (img->bitspersample <= 16 && (img->photometric == PHOTOMETRIC_MINISBLACK || img->photometric == PHOTOMETRIC_MINISWHITE)) {
/*
* Use photometric mapping table to construct
* unpacking tables for samples <= 8 bits.
*/
if (!makebwmap(img))
return (0);
/* no longer need Map, free it */
_TIFFfree(img->Map);
img->Map = NULL;
}
return (1);
}
What also puzzles me, is that we try to invert floating point values,
Lines 572 to 577 in a874b9c
but again, I haven't found any code in libtiff which would manipulate floating-point data in such a way.
I also tried creating a copy of a 32-bit floating-point encoded file where I changed the
PhotometricInterpretation
tag from BlackIsZero
to WhiteIsZero
. Both of the files are displayed the same in GIMP, Krita fails to display the WhiteIsZero
version, which seems to suggest that this inversion might be wrong.
But take this with a grain of salt. The libtiff codebase is a bit hard to read, so it's possible that I have missed something.
from image-tiff.
OK, the way libtiff handles these conversions is weird.
libtiff has a few different interfaces(man pages):
- Raw IO - returns undecoded image data
- Encoded IO - returns decoded data, swaps bytes to native byte order if needed
- RGBA IO - decodes image data into 32-bit packed RGBA
The TIFFRGBAImage
function (man pages) only supports 1, 2, 4, 8, 16 bit formats, which would partially explain why we weren't handling i32s and i64s consistently. The man pages also explain, that it's possible for users to define functions for converting from other uncommon formats to RGBA.
I also created two test images.
signed-minblack-minwhite-test.zip
I tried loading them with the TIFFRGBAImage
function and it does inverse the data but treats the data as unsigned integers. It seems strange that libtiff doesn't handle signed format by default, but it would also explain why most graphics software on my machine (Gwenview, Krita) display these files badly. The only program that renders it correctly is GIMP, which presumably uses the more low-level libtiff functions.
Therefore it's questionable if we should do implicit conversions at all.
One solution would be to not do these conversions implicitly, but provide users with some standard procedures for inverting the colors. These procedures should also take SMinSampleValue and SMaxSampleValue into account.
from image-tiff.
We only ever do color inversion if the file specifies "white is zero". A lot of the weirdness comes from seeing that tag on files where that doesn't really make sense.
from image-tiff.
Looked through the liftiff source as well and came to a similar conclusion as @TomasKralCZ. I don't see anything that indicates our current strategy is clearly wrong. I'd say we leave things as they are.
We can revisit later if anyone comes across a more definitive answer or some software that creates images with different assumptions.
from image-tiff.
Related Issues (20)
- Unavailable Specification HOT 2
- TIFF files with unassociated extra samples are unsupported. HOT 2
- Please publish new version to resolve panics HOT 1
- Error: invalid code in LZW stream. HOT 2
- 16-bit-per-channel images using PackBits compression fail to load correctly. HOT 4
- Reading a larger tiff with PackBits fails if original reader is a bufreader, but worked in 0.7.1 HOT 2
- Encoding images in CMYKA HOT 1
- InconsistentSizesEncountered error reading Tiff with planar config HOT 3
- Grey scale image decoder color type : InterpretationWithBits(RGBPalette, [8]) HOT 1
- Tags of type Short are read as Unsigned HOT 3
- Multipage + Tile support HOT 5
- CMYKA decoding
- Decoding an image with missing required tag HOT 4
- Support Exif tags
- Very minor changes to allow multiband GeoTiff reading HOT 5
- Adding Bilevel support (Gray(1) ColorType) HOT 8
- Private fields and interfaces make file inspection difficult HOT 3
- OME-TIFF specification HOT 1
- Loading fails with "invalid code in LZW stream" HOT 1
- FormatError(StripTileTagConflict) with minimal example trying to write an image HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from image-tiff.