Daher geht die Frage eher an Programmierer und Mathematiker.
Ich suche einen Algorithmus zur Transformation von Bitmaps für die Entzerrung einer Galvoprojektion.
Konkret:
Die Projektion auf eine ebene Fläche erzeugt ja bekanntlich Verzerrungen, siehe Bild.
Dabei wird ja in Abhängigkeit des Auslenkwinkels Alpha die Y-Position mit Y' = Y * 1/cos Alpha(Y) und in X mit X' = X * (1/cos Alpha(X) * 1/cos Alpha(Y) gestreckt.
Um eine Bitmap unverzerrt auf eine ebene Fläche zu projizieren, benötige ich vorab eine Transformation der Quellbitmap, damit diese nach dem Scannen (zeilenweise) wieder unverzerrt auf der Ebene erscheint.
Mein Problem ist dabei nicht einen einzelnen Punkt X/Y mit Cosinus auf eine neue Position umzurechnen, sondern alle Pixel einer Bitmap zu interpolieren. Bei einer einfachen Vektorgrafik ist das easy. Bei einer Bitmap aber kann man ja nicht einfach die Pixel überschreiben, sondern muss die Farben bilinear interpolieren. Und da fängt mein Problem an.

Gegeben sind der eingestellte maximale Auslenkwinkel der Scanner und die maximale Pixelzahl bei diesem Winkel (z.B. 4096). Je nach Größe der Quellbitmap (z.B. 3500 x 2000 Pixel) muss diese passend auf den Scanner transformiert werden. Der Maximalwinkel der Scanner bleibt fest. Die Ausgabebildgröße wird nur durch die Größe der Quellbitmap definiert. Eine kleinere Bitmap erfährt daher natürlich eine geringere Verzerrung als eine Bitmap maximaler Größe. Also wenn ich die Scanner auf 40 Grad Vollwinkel eingestellt habe, würde der Rand einer 4096 Pixel Bitmap mit 20 Grad Halbwinkel projiziert und eine 1024er Bitmap mit 5 Grad.
Die Zielbitmap sollte idealerweise bilinear interpoliert sein, eventuell später optional "nearest Neighbour".
Es handelt sich um RGB-Bitmaps 24Bit.
Ich habe jetzt schon stundenlang gegoogelt, aber was es da an Code (ich nehme Delphi) gibt, ist mehr als dürftig.
Die Rechengeschwindigkeit ist nicht allzu dramatsch. Das Bild wird sowieso vorberechnet und dann per Knopfdruck ausgegeben. Also kein "Echtzeitproblem).
Nun die Frage: Kennt sich von Euch jemand mit Grafikprogrammierung aus? Könnte jemand so eine Transformation schreiben, ohne dazu exotische Libraries, GDI oder Open-GL zu verwenden, also "zu Fuß"?
Es muss nicht direkt in Delphi sein. Ich könnte auch mit "Pseudocode" im Klartext leben, nur keine Programmiersprachen, die ich nicht übersetzen kann.
Als Funktionsaufruf stelle ich mir folgende Art vor (Delphi):
function transform(MaxScanangle : integer; SourceBitmap : TBitmap) : TBitmap;
Wenn damit jemand Erfahrung hat, wäre es toll, wenn er sich meldet.
Aber bitte nur falls jemand wirklich damit Erfahrung hat und mehr oder weniger in die Schublade greifen kann. Denn von Null anzufangen macht keinen Sinn. Dann kann ich es auch gleich selbst machen.
Das Problem ist einfach dass ich gerade wenig Zeit habe.
Es handelt sich um ein privates Projekt und um nichts kommerzielles.
Gruß
Joachim