C++: Konvertieren eines uint32 Array in ein void*?

GuteAntwort2021  10.07.2022, 20:14

Hat das Bild denn die richtigen Maße, also stimmen nur die Farben nicht, oder kommt noch mehr beisammen, wo es hakt?

redsky 
Fragesteller
 10.07.2022, 20:24

Das Bild hat die richtigen Maße ja. Ich kann sogar den Fluss oder das Dorf an der richtigen Stelle grob erkennen. Aber ich habe so komische RGB Streifen im Bild.

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

An sich sieht der Code soweit in Ordnung aus (ein bisschen unsauber, aber in Ordnung).

Erstmal: void* bedeutet an sich nur: "Vollkommen egal, wie es deklariert wurde, solange es ein Pointer ist geht das erstmal klar."

Bedeutet: Es ist vollkommen egal, ob dein Array vom Typ uint32 (nicht uint32_t?) oder color_value ist.

Z.B. geht auch das:

struct color_value{
    uint8_t R, G, B, A;
};
auto image = new color_value[20976 * 20976];

Deinen bisherigen Breschreibungen nach, klingt es am ehesten danach, dass entweder die Farbwerte in der Reihenfolge RGBA erwartet aber in ABGR übergeben werden bzw. umgekehrt.

Stichwort: Endianess (https://de.wikipedia.org/wiki/Byte-Reihenfolge)

Wenn es ein void* ist, müsstest du nicht auch irgendwo eine Länge mitgeben? Du hast auch ein Element im Array übergeben, und nicht das ganze Array. Irgendwas passt da nicht.

redsky 
Fragesteller
 10.07.2022, 20:33

Ich habe mich da grob an einem Tutorial orientiert: Dort steht

for (uint32 row = 0; row < h; row++)
{
 memcpy(buf, &image[h*linebytes], linebytes);
 TIFFWriteScanline(out, buf, row, 0)
}

linebytes ist die Breite (20976) * 3.

Und buf ist:

buf =(unsigned char *)_TIFFmalloc(linebytes)

Wenn ich aber versuche diese memcpy() Zeile einzufügen bekomme ich eine Zugriffsverletzung. Da das Bild ja durchaus auch ohne den buffer geschrieben wird, dachte ich ich könne es weglassen.

0
ranger1111  10.07.2022, 20:54
@redsky

Oh man, ich stecke aktuell zu wenig in C drin. Ich würde vermutlich ewig ausprobieren, mir die Adressen und die Inhalte ausgeben lassen, ob ich die richtigen Werte an die richtige Stelle schreiben. Die Frage ist aber natürlich beim Tutorial, was image eigentlich genau ist. Was für eine Art Array ist das? Wird das Bild zeilenweise abgespeichert?

0
redsky 
Fragesteller
 10.07.2022, 21:06
@ranger1111

Also beim Tutorial wird Image nur folgendermaßen initialisiert:

char *image=new char [width*height*sampleperpixel];

Bei mir ist image ein

auto image = new uint32[20976 * 20976];

weil ich Bytefolgen habe. So wie ich das verstehe muss ich meine Bytes irgendwie in ein char* hineinschreiben. Aber das scheint nicht so einfach zu sein.

0