2013-04-16 13 views
5

Ich versuche, mit 16-Bit-RGBA-TIFF-Bildern pro Kanal durch C Sprache umzugehen, konnte ich nicht viel Information über 16-Bit-Bilder in den Spezifikationen finden.TIFF-Bilder: Wie werden 16-Bit-RGBA-Bildpixel verschachtelt?

Im Falle eines RGBA-Bildes mit 8 Bits pro Kanal verstehe ich, dass ein Pixel als uint32 gespeichert wird und durch Gruppierung der 32 Bits in 4 Gruppen (R, G, B, A) von 8 deinterlaced werden kann Bits. dann mit 8 Bit pro Kanal RGBA Bilder zu beschäftigen, ich tue das folgende (siehe auch Quellcode here eingeschlossen):

  1. ich die Bilddaten als Uint32 Register (mit TIFFReadRGBAImageOriented), die ich nennen data_tiff
  2. I Deinterlacing Pixel mit den folgenden Befehlen: (uint8) TIFFGetR(*data_tiff), (uint8) TIFFGetG(*data_tiff), (uint8) TIFFGetB(*data_tiff) & (uint8) TIFFGetA(*data_tiff)

Bei einem 16 Bit pro Kanal RGBA Bild, können Sie mir sagen, wie kann ich Pixel deinterlacen? wenn ich Bilddaten als uint64 Registerkarte retreive könnte, dann könnte ich folgendes tun:

#define TIFF16GetR(abgr) ((abgr) & 0xffff) 
#define TIFF16GetG(abgr) (((abgr) >> 16) & 0xffff) 
#define TIFF16GetB(abgr) (((abgr) >> 32) & 0xffff) 
#define TIFF16GetA(abgr) (((abgr) >> 48) & 0xffff)` 
  1. ich die Bilddaten als uint64 Register lesen
  2. I Deinterlacing Pixel mit (uint16) TIFF16GetR(*data_tiff), (uint16) TIFF16GetG(*data_tiff), (uint16) TIFF16GetB(*data_tiff) & (uint16) TIFF16GetA(*data_tiff)

aber es scheint, dass die Daten nicht nativ in einem uint64 Register gespeichert, so dass ich frage mich, wie verschachtelt sind 16-Bit pro Kanal Bilder in eine uin t32-Pixel-Tab.

Ich bin auch mit Schwierigkeiten zu kämpfen Umgang mit 16-Bit-Graustufen-Bildern in der gleichen Art und Weise (mit TIFFReadRGBAImageOriented Bilddaten zu erhalten und zu versuchen, jedes Pixel in ein uint16 zu konvertieren)

Generell haben Sie jedes Stück Dokumentation über 16 Bit Graustufen- und Farbbilder?

Danke, Mit besten Grüßen,

Rémy A.

+1

Was meinst du mit dem Wort "Tab", oben? Ich kann das nicht analysieren ... Sollte es "Tisch" sein, vielleicht? – unwind

+0

Ich meine einen Zeiger: uint32 * –

Antwort

6

die TIFFReadRGBAImage High-Level-Schnittstelle wird das Bild mit einer Genauigkeit von 8 Bit pro Probe immer lesen.

Um ein 16bit pro Kanalbild zu lesen, ohne die Genauigkeit zu verlieren, können Sie TIFFReadScanline direkt verwenden und die korrekte Datenmenge gemäß SamplesPerPixel und BitsPerSample lesen. Dies würde jedoch nur funktionieren, wenn das Bild in Streifen gespeichert wird (keine Kacheln, die in TIFF 6.0 eingeführt wurden) und es in jedem komprimierten Streifen nur eine Zeile geben muss (wenn das Bild komprimiert ist).

Wenn Sie alle Art von TIFF-Bild zu handhaben wollen wihout mit TIFFReadRGBAImage dann müssen Sie das Bildformat erkennen und Low-Level-Schnittstelle wie TIFFReadEncodedStrip und TIFFReadEncodedTile verwenden.

Beachten Sie, dass die TIFF-Spezifikationen sehr umfangreich und flexibel sind und die Verwendung dieser Low-Level-Interfaces für jede mögliche Art von Bild keine leichte Aufgabe ist, sodass Sie besser eine höhere Bibliothek als libtiff verwenden können kann.

EDIT

Was Sie sich beziehen, in dem Kommentar der erste Teil der TIFF-6.0-Spezifikation ist bekannt als Baseline TIFF

«Wenn TIFF eingeführt wurde, seine Dehnbarkeit Kompatibilität provozierte Probleme. Die Flexibilität bei der Kodierung führte zu dem Witz, dass TIFF für Tausende von inkompatiblen Dateiformaten steht. [9] Um diese Probleme zu vermeiden, musste jeder TIFF-Leser Baseline-TIFF lesen. Die Baseline-TIFF enthält keine Ebenen oder Komprimierung mit JPEG oder LZW. Die Baseline TIFF als TIFF 6.0, Teil 1 formal bekannt: Baseline TIFF »von Wikipedia

A Baseline TIFF nicht Bittiefe höher als 8-Bit-Unterstützung, so dass deshalb in der Beschreibung der Baseline TIFF, die Der Wert BitsPerSample für ein Graustufenbild kann nur 4 oder 8 sein und für ein RGB-Bild nur 8 Bit pro Kanal. Eine höhere Bittiefe wird als Erweiterung der Baseline-TIFF-Spezifikation unterstützt, und es ist nicht erforderlich, für einen TIFF-Leser, um sie zu unterstützen.

gekachelte Bilder ist auch eine Erweiterung der Basisspezifikation, wo StripOffsets, StripByteCounts und RowsPerStrip Felder durch TileWidth ersetzt wird, TileLength, TileOffsets und TileByteCounts so können Sie durch einen Blick auf die vorhandenen Felder ein gefliestes Bild von einem gestrippt Bild unterscheiden Verwendung TIFFGetField().

+0

Vielen Dank für Ihre Antwort, ich könnte etwas lesen, wie Sie irgendwo im Web vorschlagen, dass auch die Haupteinschränkung der Scanline-orientierte Schnittstelle, abgesehen von der Notwendigkeit, zuerst eine vorhandene Datei zu identifizieren Eine geeignete Organisation besteht darin, dass ein wahlfreier Zugriff auf einzelne Scanlinien nur bereitgestellt werden kann, wenn Daten nicht in einem komprimierten Format gespeichert sind oder wenn die Anzahl der Zeilen in einem Streifen von Bilddaten auf eins gesetzt ist (RowsPerStrip ist eins). was bedeutet, dass ein solcher Weg, mit 16-Bit-Bildern umzugehen, für ein 16-Bit-Bild nicht funktioniert. Kennen Sie einen anderen Weg, dies zu tun? –

+0

Ja, ich habe meine Antwort bearbeitet, um die Begrenzung des Scanline-Ansatzes explizit zu machen. – zakinster

+0

ok danke für diese sehr vollständige Antwort. Ich wäre glücklich, eine High-Level-Bibliothek zu verwenden, aber je weniger ich Abhängigkeiten einführe, desto besser ist es ... –

Verwandte Themen