Distorcere Immagini con GDIplus (primo approccio)

Pensieri ad alta voce e implementazioni di prova per ottenere una distorsione libera (non a parallelogramma) di un'immagine utilizzando C# e le API GDI+ del .Net Framework...

Il Framework .Net difetta, nell'implementazione delle API GDI+, di un metodo che permetta di distorcere un'immagine a piacimento dati quattro nuovi vertici di riferimento.

Il metodo DrawImage della classe System.Drawing.Graphics in realtà prevede questa opzione (vedi codice estrapolato tramite Reflector), purtroppo senza averla implementata.

public void DrawImage(Image image, PointF[] destPoints, 
    RectangleF srcRect, GraphicsUnit srcUnit, 
    ImageAttributes imageAttr, 
    Graphics.DrawImageAbort callback, int callbackData)
{
    if (destPoints == null)
    {
        throw new ArgumentNullException("destPoints");
    }
    if (image == null)
    {
        throw new ArgumentNullException("image");
    }
    int num1 = destPoints.Length;
    if ((num1 != 3) && (num1 != 4))
    {
        throw new ArgumentException(SR.GetString("GdiplusDestPointsInvalidLength"));
    }
    IntPtr ptr1 = SafeNativeMethods.Gdip.ConvertPointToMemory(destPoints);
    int num2 = SafeNativeMethods.Gdip.GdipDrawImagePointsRect(
        new HandleRef(this, this.NativeGraphics), 
        new HandleRef(image, image.nativeImage), 
        new HandleRef(this, ptr1), 
        destPoints.Length, 
        srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, 
        (int) srcUnit, 
        new HandleRef(imageAttr, (imageAttr != null) ? 
        imageAttr.nativeImageAttributes : 
        IntPtr.Zero), 
        callback, new HandleRef(null, (IntPtr) callbackData));
        Marshal.FreeHGlobal(ptr1);
    this.IgnoreMetafileErrors(image, ref num2);
    this.CheckErrorStatus(num2);
}

L'idea iniziale è stata quella di sfruttare, quanto più possibile, quello che il Framework mette già a disposizione ed improvvisare una sorta di meshing dell'immagine.

Allo stato attuale la procedura di suddivisione in triangoli (schematizzata sotto) non è iterabile e le maschere di ritaglio non collimano in maniera perfetta. Tant'è; si tratta di un prototipo di soluzione...

scheme

Tralascio aspetti e forumle geometriche/trigonometriche ed espongo una demo.

test img
top-left corner: ,
top-right corner: ,
bottom-left corner: ,
bottom-right corner: ,
 
 
warning! Il metodo utilizzato in questo articolo è da considerarsi tecnicamente superato.
Per una soluzione definitiva del problema, prego fare riferimento a questo articolo.

Take care. Bye.


Feedbacks

no feedbacks yet.

SL2