Seite 1 von 1

[gelöst] TiffIO Plugin vs libqtiff.so - libtiff

Verfasst: 16. November 2008 22:29
von Perry3D
Guten Tag.

Ich versuche nun schon ein Weile ein 8 Bit per Pixel Tiff aus einem QImage zu schreiben.
Dazu habe ich folgendermaßen ein QImage angelegt.

Code: Alles auswählen

image=new QImage( *(new QSize(width,height)), QImage::Format_Indexed8);
for(int i=0;i<256;i++)
	colorTable[i] = qRgb(i,i,i);
image->setColorTable(colorTable);
Da das Standard Plugin von QT (libqtiff.so) meines Wissens nur 32-Bit Bilder schreibt (oder?), habe ich es mit TiffIO probiert.

Code: Alles auswählen

QImageWriter writer;
writer.setFormat("TIFF");
writer.setFileName(newSaveAs.absoluteFilePath());
writer.setText("parameters", "lzw bps=8");
if (writer.write(image)) cout << "TIFF File written" << endl;
Nur wie mache ich der Applikation nun bekannt, TiffIO und nicht libqtiff.so zu benutzen? Ich habe das Plugin auch schon anhand einer Instanz von QPluginLoader manuell geladen. Hat aber auch nichts gebracht.

Oder noch besser: Wie kann libqtiff.so 8 Bit Bilder schreiben.



Gruß Perry

Verfasst: 17. November 2008 06:30
von Christian81
Qt ohne tiff-support kompilieren bzw. das Qt-tiff Plugin löschen.

/edit:

Code: Alles auswählen

image=new QImage( *(new QSize(width,height)), QImage::Format_Indexed8); 
[/new]
Warum erzeugst Du hier ohne Not ein memleak mit new QSize() ?

Verfasst: 17. November 2008 12:25
von Perry3D
Vielen Dank für die Antwort.

Auf die Idee bin ich auch schon gekommen. Aber ich habe auf eine elegantere Lösung gehofft.

Zu dem Memleak: Ist wohl beim Rumprobieren entstanden. Das war keine Absicht.

Verfasst: 17. November 2008 12:44
von Christian81
Was anderes fällt mir leider nicht ein - ich weiss nicht wer gewinnt wenn zwei Plugins das Gleiche bereitstellen.

Verfasst: 19. November 2008 00:32
von Perry3D
Ok, ich hab es jetzt ganz anders gemacht. Vielleicht interessiert sich jemand für die Lösung.
Ich habe einfach die libtiff benutzt. Hat auch hervoragend mit dem QImage zusammengearbeitet.

Code: Alles auswählen

#include <tiffio.h>
...
void writeTIFF(const QString& filename,QImage* image)
{
	TIFF* tif = TIFFOpen(filename.toAscii().data(), "w");
	TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_LZW)
	TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, image->width());
	TIFFSetField(tif, TIFFTAG_IMAGELENGTH, image->height());
	TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
	TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
	TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, 3);
	TIFFSetField(tif, TIFFTAG_XRESOLUTION, 10000/DataHandler::micronWidth);
	TIFFSetField(tif, TIFFTAG_YRESOLUTION, 10000/DataHandler::micronHeight);

	TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, 1); // für 1: weiss = kleinster Wert(0)
	for (int row = 0; row < image->height(); ++row)
	{
		TIFFWriteScanline(tif, image->scanLine(row), row, 0);
	}
	TIFFClose(tif);

}
Noch ein "LIBS += -ltiff" in der .pro Datei und fertig.
Manche Tags sind wahrscheinlich optional.

Gruß Perry