C++: Fehler beim schreiben einer .tiff Datei mit Libtiff?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
auto image = new uint32[20976 * 20976];
for (uint32 row = 0; row < height; row++)
	{
		TIFFWriteScanline(tif, image, row, 0);
                        /*      ^^^^^ */
	}

Du holst Die Daten für die Zeile immer von der gleichen Adresse, das sollte eher sowas sein:

TIFFWriteScanline(tif, image+(row*20976), row, 0);

Das ist das Einzige, was direkt ins Auge springt.

P.S.: Du dürftest das natürlich auch Indexbasiert als Arrazugriff schreiben, falls das nicht klar sein sollte.

Ich sehe auf Anhieb nicht, warum das Tutorial rückwärts über die Zeiles des Rasters geht, es sei denn, das Format sieht die Anordnung vor, dann passt Du das entsprechend an.

redsky 
Fragesteller
 10.07.2022, 11:41

Danke schonmal für den Hinweis.
Anders als vorher schreibt er schonmal das Bild in die Datei so wie es aussehen soll. Also ich kann z.B. den Fluss erkennen und Bäume. Das ist ein Fortschritt Leider habe ich immernoch diese senkrechten RGB Streifen. Ich muss jetzt mal den Code von vorne bis hinten prüfen

0
KarlRanseierIII  10.07.2022, 13:57
@redsky

Schau unbedingt nochmal wegen des Pixelformats und der Byteanordnung und der Byteordnung am Host, eventuell steckt da das Problem.

0
redsky 
Fragesteller
 10.07.2022, 19:18
@KarlRanseierIII

Ehrlich gesagt weiß ich nicht, was du mit Byteanordnung meinst.
Ich habe mir mal die RGB Werte bei Image[9000] ausgeben lassen kurz bevor ich TIFFWriteScanline ausführe. Dafür bietet Libtiff die Funktion TIFFGetR().

std::cout << TIFFGetR(image[9000]) << std::endl;
std::cout << TIFFGetG(image[9000]) << std::endl;
std::cout << TIFFGetB(image[9000]) << std::endl;
for (uint32 row = 0; row < nheight; row++)
{
	TIFFWriteScanline(tif,&image[row * nheight], row, 0);
}

Ich bekomme:

54
72
85

Das sind an dieser Position gute Farbwerte die Sinn machen.

Im tatsächlichen Bild bekomme ich an dieser Position die Werte:

255
71
84

Generell habe ich in jeder Spalte einen Pixel mit dem Wert 255 für entweder R,G oder B.

Meine aktuelle Vermutung:

Ich habe die RGB Daten in einem uint32 Array (image). TIFFWriteScanline erwartet einen void*. Deshalb habe ich &image geschrieben. Kann es sein, dass das Programm bei &image nicht die richtigen Werte übergibt und wie würde ich das lösen? Oder bin ich auf dem falschen Weg?

0
KarlRanseierIII  10.07.2022, 22:48
@redsky

Das sieht mir nach einer Offsetverschiebung aus, Wenn das Bild nicht ausdrücklich Alpha nutzt, wäre der Wert 255 für Alpha bei jedem Pixel (nicht transparent). Wenn der Wert bei Dir gleichmässig über die Farbkanäle wandert, spricht das dafür, daß das Alignment irgendwie nicht zu stimmen scheint.

1