Bilddaten kopieren bzw. geometrisch ändern
-
Hallo !!
Hab mal wieder ein Prob mit Bildverarbeitung..
Ich möchte ein Bild anhand einer vorberechneten Matrix geometrisch verzerren, was letztlich dazu führt, dass ich den Pixelwert von Ort x,y nehme und im zweiten Bild am Ort x,y+dy(x) eintrage.
Mit Get/Set-Pixel kein Problem nur viel zu langsam. Immerhin sehe ich hier, dass die Formeln soweit richtig sind.Mein neuer Ansatz geht über Lockbits. Dass ist aber insofern problematisch, dass ich das exakte Farbformat berücksichtigen muss. Ich hab hierzu Variablen deklariert wie stride, offset und besonders channels.
Hab ich zB 32bppARGB so ist channels = 4. Damit ich nicht für jeden Bildtyp das Programm ändern muss, steck ich die Kanäle nicht in eigene Arrays, sondern definiere innerhalb For(x)(For(y)) eine dritte Iteration for(i=0; i<channels;i++)..........unsafe { byte* ptr = (byte*)Data.Scan0.ToPointer(); byte* ptrstart = (byte*)Data.Scan0.ToPointer(); byte* ptr2 = (byte*)Data2.Scan0.ToPointer(); double plusy; int yp; int point; byte grey; //indexierung zeilenweise im Bild -> for (int dy = 0; dy < Data.Height; dy++) { for (int dx = 0; dx < Data.Width; dx++, ptr2 += 1) { plusy = dyperx[dx]; yp = (int)Math.Round(plusy + dy, MidpointRounding.AwayFromZero); if (yp >= 0 && yp < height) { point = dx+yp*(int)(stride/datalength) + yp * offset; ptr = ptrstart + point; for (byte i = 0; i < channels; i++) { grey = *(ptr + i); *(ptr2 + i) = grey; } } else { for (byte i = 0; i < channels; i++) { *(ptr2 + i) = 0; } } } ptr2 += offset; } }
Warum geht das nicht so wie es soll??
Mal kriege ich 4 kleine Pics (4 channel) nebeneinander, ein andernmal nur den R-Kanal, dann wieder nur ca 1/3 der Bildhöhe, der Rest ist scheinbar transparent
usw usf.
An den x,y+dy liegts schonmal nicht. Die gehen alle Werte durch. Hatte ich ja mit SetPixel getestet.
Könnte die darauf aufbauende Definition für Point falsch sein? So wie ich den Bildaufbau verstehe, müsste x direkt eingehen und y über stride*y+offset*y oder ??
Gibt es ev anderen Code für schnelle Transformationen, auch für Mehrkanal-Bilder??MFG
-
Warum postest Du hier? Sieht nach C# aus...oder?
-
Sorry hab den Link verwechselt. Ich dachte ich BIN bei C#...
Kann man das verschieben?
-
Rad neu erfinden?
http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.matrix.aspxKannst du nicht bei der Zielbitmap einen Graphics erstellen in der du mit der entsprechenden Matrix hineinzeichnest?
-
Rhombicosidodecahedron schrieb:
Rad neu erfinden?
http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.matrix.aspxKannst du nicht bei der Zielbitmap einen Graphics erstellen in der du mit der entsprechenden Matrix hineinzeichnest?
Hab ich auch gedacht. Geht leider nicht. Es handelt sich um mehrere nichtlineare, ortsabhängige Transformationen.
Die Berechnug hab ich fertig. Was fehlt ist die Anwendung aufs Bild.
Mit GET/SET-Pixel gehts ja.
Ich möchte nur SCHNELLER sein und möglichst unabhängig vom Bild-Typ.
Das bedeutet. ich muss entweder eine 3d-Matrix benutzen (dritte Dimension = Anzahl bytes pro Punkt) oder wie oben beschrieben durchiterieren.
Oder gibts dazu ne bessere Idee??
Kann man statt bytepointer größere pointer nehmen ??
Idee ??MFG T.